具有快速滚动和字母部分索引的 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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 11:00:04  来源:igfitidea点击:

Android ListView with fast scroll and alphabetical section index

androidandroid-layoutandroid-intentandroid-emulatorandroid-widget

提问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)所示。我该怎么做,你能帮我吗?先感谢您!

screenshot of desired UI

所需用户界面的屏幕截图

// 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 StringMatcherclass

为了编译项目并摆脱韩文更新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 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.xmlwill 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