具有快速滚动和字母部分索引的 Android ListView
Posted
技术标签:
【中文标题】具有快速滚动和字母部分索引的 Android ListView【英文标题】:Android ListView with fast scroll and alphabetical section index 【发布时间】:2012-09-15 16:04:55 【问题描述】:如图所示,当触摸右侧字母面板上的字母时如何添加测试视图? 请你帮助我好吗?下面是我的代码。
详细来说,我正在寻找一个与下图完全相同的示例。目前我对数据进行了排序。当我单击右侧字母面板时,它会正确显示数据。但问题是当触摸右侧字母面板上的字母时,我需要显示他正在按下的大尺寸字母,如图(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;
【问题讨论】:
“在触摸字母时添加文本”不叫键盘吗? @H2CO3 你好,你知道怎么做吗? 曾经有一个关于它的android教程,但由于他们制作了一个更完整的文档,它就消失了。 【参考方案1】:Hear 是您需要的一个很酷的例子https://github.com/woozzu/IndexableListView
为了编译项目并摆脱韩文更新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;
【讨论】:
私有最终静态字符 KOREAN_UNICODE_START = 'ê°€';私有最终静态字符 KOREAN_UNICODE_END = '힣'; private final static char KOREAN_UNIT = '까' - 'ê°€'; private final static char[] KOREAN_INITIAL = 'ㄱ', 'ㄲ', 'ã„´', 'ã„·', 'ㄸ', 'ㄹ', 'ã…�' , 'ã...‚', 'ã...ƒ', 'ã...' , 'ã...†', 'ã...‡', 'ã...^', 'ã...‰', 'ã...Š', ' ã...‹', 'ã...Œ', 'ã...�', 'ã...Ž'; 这个类在你的真实例子中没有用,但如果你想运行应用程序,我已经更新了答案 非常感谢 Nixit.. 这个示例工作正常.. 我将实施到我的项目 nw.. 再次感谢。 接受答案并关闭帖子,这样对其他人也有帮助 嗨,nixit ...今天我开始在我的项目中实现你的代码..但我收到错误..你可以查看代码吗..我将编辑上面的代码.. 【参考方案2】:如果您想将点击的字母表显示为 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();
);
而您的 toast_custom_layout.xml
将是一个 100 x 100 的布局,文本大小较大
【讨论】:
我的字母键非常小。示例:-当我将手指靠近字母键时,它必须在文本视图/吐司/一些什么的图像中像 E 一样显示在大边上。我认为实时示例就像 android 4.0 中的联系人 .. 在这里他们使用了这个概念。 【参考方案3】:我已经在片段中显示了列表,如果你想在主活动中显示,那么你可以传递这个,而不是 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);
);
【讨论】:
以上是关于具有快速滚动和字母部分索引的 Android ListView的主要内容,如果未能解决你的问题,请参考以下文章
带有折叠工具栏的 RecyclerView 中的 Android 字母快速滚动视图