具有快速滚动和字母部分索引的 Android ListView
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/12560919/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Android ListView with fast scroll and alphabetical section index
提问by Rao's
How to add testview when touching a letter on right alphabet panel as shown in images? Could you please help me? Below is my code.
触摸右侧字母面板上的字母时如何添加测试视图,如图所示?请你帮助我好吗?下面是我的代码。
In details, I am looking for an example exactly like below image. Currently I did the sorting of data. When I click on right alphabet panel it shows the data properly. But the problem is when touching a letter the right alphabet panel I need to show what letter he is pressing in large size shown in image(E). How can I do it, could you please help me? Thank you in advance!
详细地说,我正在寻找一个与下图完全相同的示例。目前我做了数据的排序。当我单击右侧字母面板时,它会正确显示数据。但问题是当触摸一个字母时,我需要在右侧的字母面板上显示他正在按的大尺寸字母,如图(E)所示。我该怎么做,你能帮我吗?先感谢您!
// MainActivity.java
public class MainActivity extends Activity implements
SearchView.OnQueryTextListener,
SearchView.OnCloseListener {
private IndexableListView listView;
private SearchView search;
EfficientAdapter objectAdapter;
EfficientAdapter2 objectAdapter1;
int textlength = 0;
private CheckBox checkStat, checkRoutine, checkTat;
private ArrayList<Patient> patientListArray;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.homempleb);
Log.i("scan"," txtScanResult ");
ActionItem nextItem = new ActionItem();
final QuickAction quickAction = new QuickAction(this, QuickAction.VERTICAL);
quickAction.addActionItem(nextItem);
quickAction.setOnDismissListener(new QuickAction.OnDismissListener() {
@Override
public void onDismiss() {
Toast.makeText(getApplicationContext(), "Dismissed", Toast.LENGTH_SHORT).show();
}
});
listView = (IndexableListView) findViewById(R.id.homelistView);
listView.setTextFilterEnabled(true);
listView.setFastScrollEnabled(true);
listView.setFastScrollAlwaysVisible(true);
objectAdapter = new EfficientAdapter(this);
listView.setAdapter(objectAdapter);
}
@Override
public boolean onClose() {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
return false;
}
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
}
...
...
// EfficientAdapter.java
public class EfficientAdapter extends BaseAdapter implements SectionIndexer {
private String mSections = "#ABCDEFGHIJKLMNOPQRSTUVWXYZ";
ArrayList<Patient> patientListArray;
private LayoutInflater mInflater;
private Context context;
public EfficientAdapter(Context context) {
mInflater = LayoutInflater.from(context);
this.context=context;
String patientListJson = CountriesList.jsonData;
JSONObject jssson;
try {
jssson = new JSONObject(patientListJson);
patientListJson = jssson.getString("PostPatientDetailResult");
} catch (JSONException e) {
e.printStackTrace();
}
Gson gson = new Gson();
JsonParser parser = new JsonParser();
JsonArray Jarray = parser.parse(patientListJson).getAsJsonArray();
patientListArray = new ArrayList<Patient>();
for (JsonElement obj : Jarray) {
Patient patientList = gson.fromJson(obj, Patient.class);
patientListArray.add(patientList);
Collections.sort(patientListArray, new Comparator<Object>() {
@Override
public int compare(Object o1, Object o2) {
Patient p1 = (Patient) o1;
Patient p2 = (Patient) o2;
return p1.getName().compareToIgnoreCase(p2.getName());
}
});
}
}
public int getCount() {
return patientListArray.size();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.homemplebrowview, null);
holder = new ViewHolder();
holder.text1 = (TextView) convertView.findViewById(R.id.name);
holder.text2 = (TextView) convertView.findViewById(R.id.mrn);
holder.text3 = (TextView) convertView.findViewById(R.id.date);
holder.text4 = (TextView) convertView.findViewById(R.id.age);
holder.text5 = (TextView) convertView.findViewById(R.id.gender);
holder.text6 = (TextView) convertView.findViewById(R.id.wardno);
holder.text7 = (TextView) convertView.findViewById(R.id.roomno);
holder.text8 = (TextView) convertView.findViewById(R.id.bedno);
holder.btnList = (Button) convertView.findViewById(R.id.listbutton);
holder.btnList.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// Intent next=new Intent(context, SeviceDetails.class);
// context.startActivity(next);
}
});
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.text1.setText(Util.formatN2H(patientListArray.get(position).getName()));
holder.text2.setText(patientListArray.get(position).getMrnNumber());
holder.text3.setText(Util.formatN2H(patientListArray.get(position).getRoom()));
holder.text4.setText(Util.formatN2H(patientListArray.get(position).getAge()));
holder.text5.setText(Util.formatN2H( patientListArray.get(position).getGender()));
holder.text6.setText(Util.formatN2H(patientListArray.get(position).getWard()));
holder.text7.setText(Util.formatN2H(patientListArray.get(position).getRoom()));
holder.text8.setText(Util.formatN2H(patientListArray.get(position).getBed()));
return convertView;
}
static class ViewHolder {
public Button btnList;
public TextView text8;
public TextView text7;
public TextView text6;
public TextView text5;
public TextView text4;
public TextView text1;
public TextView text2;
public TextView text3;
}
@Override
public void notifyDataSetChanged() {
super.notifyDataSetChanged();
}
//@Override
public int getPositionForSection(int section) {
// If there is no item for current section, previous section will be selected
for (int i = section; i >= 0; i--) {
for (int j = 0; j < getCount(); j++) {
if (i == 0) {
// For numeric section
for (int k = 0; k <= 9; k++) {
if (StringMatcher.match(String.valueOf(patientListArray.get(j).getName().charAt(0)), String.valueOf(k)))
return j;
}
} else {
if (StringMatcher.match(String.valueOf(patientListArray.get(j).getName().charAt(0)),
String.valueOf(mSections.charAt(i))))
return j;
}
}
}
return 0;
}
//@Override
public int getSectionForPosition(int position) {
return 0;
}
//@Override
public Object[] getSections() {
String[] sections = new String[mSections.length()];
for (int i = 0; i < mSections.length(); i++)
sections[i] = String.valueOf(mSections.charAt(i));
return sections;
}
}
回答by Nixit Patel
Hear is one cool example of what you need https://github.com/woozzu/IndexableListView
听到是你需要的一个很酷的例子 https://github.com/woozzu/IndexableListView
IN order to compile the project and get rid of korean text update the StringMatcher
class
为了编译项目并摆脱韩文更新StringMatcher
类
package com.woozzu.android.util;
public class StringMatcher {
public static boolean match(String value, String keyword) {
if (value == null || keyword == null)
return false;
if (keyword.length() > value.length())
return false;
int i = 0, j = 0;
do {
int vi = value.charAt(i);
int kj = keyword.charAt(j);
if (isKorean(vi) && isInitialSound(kj)) {
} else {
if (vi == kj) {
i++;
j++;
} else if (j > 0)
break;
else
i++;
}
} while (i < value.length() && j < keyword.length());
return (j == keyword.length())? true : false;
}
private static boolean isKorean(int i) {
return false;
}
private static boolean isInitialSound(int i) {
return false;
}
}
回答by Andras K
You might want to check this out:
你可能想看看这个:
https://github.com/andraskindler/quickscroll
https://github.com/andraskindler/quickscroll
This is a library project I created, because I had to use this scrolling pattern in a few recent apps, so I thought others might be interested in it. It's fairly easy to use, see readme in the github link above.
这是我创建的一个库项目,因为我不得不在最近的几个应用程序中使用这种滚动模式,所以我认为其他人可能会对它感兴趣。它相当容易使用,请参阅上面 github 链接中的自述文件。
回答by Dwivedi Ji
Try this,
尝试这个,
http://files.cnblogs.com/anee/MyContact20121102123333_last.rar
http://files.cnblogs.com/anee/MyContact20121102123333_last.rar
This is working for me. this is better way to implement the section indexer.
这对我有用。这是实现部分索引器的更好方法。
Please prefer this GIT to get more Example of SectionIndexer
请更喜欢这个 GIT 以获得更多 Example of SectionIndexer
回答by AVEbrahimi
Just try https://github.com/andraskindler/quickscroll
试试https://github.com/andraskindler/quickscroll
It's working good and by a tweak you can use it with GridView.
它运行良好,通过调整您可以将它与 GridView 一起使用。
回答by Pankaj Joshi
I have displayed the list inside a fragment, if you want to display in main activity then you can pass this, instead of getActivity()
我已经在片段中显示了列表,如果你想在主活动中显示,那么你可以传递这个,而不是 getActivity()
//method to display the side indexed scroll list of alphabets
public void displayAlphabetsList() {
final List<String> listOfAlphabet = new ArrayList<>();
for (int i = 0; i < 26; i++) {
char alphabet = (char) (ASCII_VALUE_OF_A + i);
listOfAlphabet.add(String.valueOf(alphabet));
}
ArrayAdapter<String> adapter = new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1, listOfAlphabet);
alphabets_List_View.setAdapter(adapter);
alphabets_List_View.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
///scroll the recycler view to that position where matching letter was found
int positionToScroll = 0;
for (int i = 0; i < mContacts.size(); i++) {
if (mContacts.get(i).getFirstName().startsWith(listOfAlphabet.get(position)))
break;
else
positionToScroll++;
}
recyclerView.scrollToPosition(positionToScroll);
}
});
}
回答by Archie.bpgc
If you want to show the alphabet clicked as a Toast (a custom toast like the one shown in the image) use this:
如果要将单击的字母表显示为 Toast(如图所示的自定义 Toast),请使用以下命令:
view.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
LayoutInflater inflater = getLayoutInflater();
View layout = inflater.inflate(R.layout.toast_custom_layout,
(ViewGroup) findViewById(R.id.toast_layout_root));
Toast toast = new Toast(getApplicationContext());
toast.setGravity(Gravity.BOTTOM, 0, 0);
// to position the Toast on the screen
toast.setDuration(Toast.LENGTH_LONG);
// to set the duration, the toast should appear
toast.setView(layout);
// a custom layout for the toast
toast.show();
}
});
and your toast_custom_layout.xml
will be a 100 x 100 layout with large text size
你toast_custom_layout.xml
将是一个 100 x 100 的布局和大文本大小
回答by Rao's
Hear is one good example of what you looking for https://github.com/woozzu/IndexableListView
听到是您正在寻找的一个很好的例子 https://github.com/woozzu/IndexableListView