【问题标题】:How to Delete Listview Item Using ImageView as OnClick Event如何使用 ImageView 作为 OnClick 事件删除 Listview 项目
【发布时间】:2019-12-06 16:28:34
【问题描述】:

好的,我有一个 Listview 适配器,它按顺序包含一个 ImageView、TextView 和另一个 ImageView。所以我希望能够在用户按下第二个 ImageView 时删除列表中的项目。当用户按下列表中的项目时,它将启动 TextToSpeech 并说出 TextView 中的内容。但是,如果用户想要删除该条目,他/她将按下作为删除图标的第二个 ImageView,此时该项目将从列表中删除。启动 imageview 的点击监听器不是问题,问题是我如何在 listview 适配器中获取相应项目的编号(int),以便我可以将其从数组中删除。这是列表中单个条目的 xml list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_marginTop="3dp"
        android:layout_marginBottom="3dp">

        <ImageView
            android:id="@+id/item_icon_imageview"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="0.15"
            android:src="@drawable/ic_record_voice_24dp2"/>

        <TextView
            android:id="@+id/phrase_textview"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="0.80"
            android:textSize="20sp"
            android:layout_marginTop="5dp"
            android:text="My phone number is 305 666 8454"/>

        <ImageView
            android:layout_gravity="center"
            android:id="@+id/delte_item_imageview"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="0.10"
            android:src="@drawable/ic_delete_black_24dp"/>

    </LinearLayout>

</RelativeLayout>

膨胀列表视图的片段

public class CustomFragment extends Fragment {
    private ArrayAdapter<String> adapter;
    private ListView listView;
    private FloatingActionButton addPhraseButton;
    private TextView phraseTitleTextView;
    private TextToSpeech textToSpeech;
    private ArrayList<String> phrases;
    private static final String PHRASE_LABEL = " Phrases";
    private static final String CATEGORY_KEY = "categories";
    private ImageView deleteItemImageView;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_custom, container, false);

        final String categories;
        //if we selecte a category sent from home fragment else we got here through menu
        Bundle arguments = getArguments();
        if (arguments != null && arguments.containsKey(CATEGORY_KEY)) {
            categories = arguments.getString(CATEGORY_KEY).toLowerCase();
        }
        else {
            Resources res = view.getResources();
            categories = res.getStringArray(R.array.categories)[0].toLowerCase();
        }

        final Phrases allPhrases = Phrases.getPhrases();
        allPhrases.fetchAllPhrases(view.getContext());
        phrases = allPhrases.getAllPhrases().get(categories);

        phraseTitleTextView = view.findViewById(R.id.label_phrases_txtview);
        deleteItemImageView = view.findViewById(R.id.delte_item_imageview);

        phraseTitleTextView.setText(categories.substring(0,1).toUpperCase() +
                categories.substring(1)+ PHRASE_LABEL);
        addPhraseButton = view.findViewById(R.id.add_phrases_btn);
        // setting local for text to speech
        textToSpeech = new TextToSpeech(getActivity().getApplicationContext(), new TextToSpeech.OnInitListener() {
            @Override
            public void onInit(int status) {
                textToSpeech.setLanguage(Locale.US);
            }
        });

        //setting adapter and listview
        adapter = new ArrayAdapter<String>(getContext(), R.layout.entry_item, R.id.phrase_textview, phrases);
        listView = (ListView) view.findViewById(R.id.phrases_list);
        listView.setAdapter(adapter);
        listView.setItemsCanFocus(true);

        //activating text to speech when user selects item in listview
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> paren, View view, int position, long id) {
                String text = phrases.get(position);
                Toast.makeText(getContext(), text, Toast.LENGTH_LONG).show();
                textToSpeech.speak(text, TextToSpeech.QUEUE_FLUSH,null, null);
            }
        });

        deleteItemImageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

            }
        });

        //button to display alert dialog box to add new phrase
        addPhraseButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                addPhraseDialogBox();
            }
        });
        return view;
    }
}

【问题讨论】:

  • 我认为您应该使用 RecyclerView 并创建一个自定义适配器来实现您的要求
  • 你必须使用自定义适配器来实现这个
  • 我必须在自定义适配器中实现 onClicklistener 吗?
  • 是的,你必须
  • 关注link

标签: java android listview


【解决方案1】:

您可以通过自定义适配器来实现这一点。检查以下:

public class CustomArrayAdapter extends ArrayAdapter<String> {

    LayoutInflater inflater;
    ArrayList<String> phrases;

    public CustomArrayAdapter(Context context, int textViewResourceId, ArrayList<String> items) {
        super(context, textViewResourceId, items);
        inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        phrases = items;
    }


    @Override
    public View getView(final int position, View convertView, final ViewGroup parent) {

        if (convertView == null) {
            convertView = inflater.inflate(R.layout.entry_item, parent, false);
        }

        ....

        ImageView deleteItemImageview = (ImageView) convertView.findViewById(R.id. delte_item_imageview);
        deleteItemImageview.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                phrases.remove(position);
                notifyDataSetChanged();
            }
        });

        return convertView;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    • 2015-09-01
    相关资源
    最近更新 更多