【问题标题】:Adding Toast to Every ChildItem of a Multi Level Expandable LisView向多级可扩展列表视图的每个子项添加 Toast
【发布时间】:2021-04-28 15:15:35
【问题描述】:

我发现这个multilevel expandable listview 对我的项目非常准确,但我还想为每三层(即最后一层视图)子项添加一个不同的 toast。我试过这个:

expandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
            @Override
            public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {

             
                Toast.makeText(thirdLevelq1.put(q1[0] this, "The first child" , Toast.LENGTH_LONG).show();
                return false;

            }
        });  

但它给出了错误。我什至尝试对每个 childItem 使用相同的 toast 文本,安装的应用程序在我打开适配器时崩溃了。那么,如何正确添加呢?

Java:

package com.bacon.expandablelistview;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ExpandableListView;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private ExpandableListView expandableListView;

    String[] parent = new String[]{"What is View?", "What is  Layout?", "What is Dynamic Views?"};
    String[] q1 = new String[]{"List View", "Grid View"};
    String[] q2 = new String[]{"Linear Layout", "Relative Layout"};
    String[] q3 = new String[]{"Recycle View"};
    String[] des1 = new String[]{"A layout that organizes its children into a single horizontal or vertical row. It creates a scrollbar if the length of the window exceeds the length of the screen."};
    String[] des2 = new String[]{"Enables you to specify the location of child objects relative to each other (child A to the left of child B) or to the parent (aligned to the top of the parent)."};
    String[] des3 = new String[]{"This list contains linear layout information"};
    String[] des4 = new String[]{"This list contains relative layout information,Displays a scrolling grid of columns and rows"};
    String[] des5 = new String[]{"Under the RecyclerView model, several different components work together to display your data. Some of these components can be used in their unmodified form; for example, your app is likely to use the RecyclerView class directly. In other cases, we provide an abstract class, and your app is expected to extend it; for example, every app that uses RecyclerView needs to define its own view holder, which it does by extending the abstract RecyclerView.ViewHolder class."};

    LinkedHashMap<String, String[]> thirdLevelq1 = new LinkedHashMap<>();
    LinkedHashMap<String, String[]> thirdLevelq2 = new LinkedHashMap<>();
    LinkedHashMap<String, String[]> thirdLevelq3 = new LinkedHashMap<>();
    /**
     * Second level array list
     */
    List<String[]> secondLevel = new ArrayList<>();
    /**
     * Inner level data
     */
    List<LinkedHashMap<String, String[]>> data = new ArrayList<>();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

//The problem starts here

expandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
            @Override
            public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {


                Toast.makeText(getApplicationContext(), "The first child", Toast.LENGTH_LONG).show();
                return false;

            }
        });


        setUpAdapter();
    }

    private void setUpAdapter() {
        secondLevel.add(q1);
        secondLevel.add(q2);
        secondLevel.add(q3);
        thirdLevelq1.put(q1[0], des1);
        thirdLevelq1.put(q1[1], des2);
        thirdLevelq2.put(q2[0], des3);
        thirdLevelq2.put(q2[1], des4);
        thirdLevelq3.put(q3[0], des5);

        data.add(thirdLevelq1);
        data.add(thirdLevelq2);
        data.add(thirdLevelq3);
        expandableListView = (ExpandableListView) findViewById(R.id.expandible_listview);
        //passing three level of information to constructor
        ThreeLevelListAdapter threeLevelListAdapterAdapter = new ThreeLevelListAdapter(this, parent, secondLevel, data);
        expandableListView.setAdapter(threeLevelListAdapterAdapter);
        expandableListView.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {
            int previousGroup = -1;

            @Override
            public void onGroupExpand(int groupPosition) {
                if (groupPosition != previousGroup)
                    expandableListView.collapseGroup(previousGroup);
                previousGroup = groupPosition;
            }
        });


    }
}

提前致谢。

编辑:当我使用 Toast.makeText(getApplicationContext(), "The first child", Toast.LENGTH_LONG).show(); 时,它的崩溃日志显示:

  Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ExpandableListView.setOnChildClickListener(android.widget.ExpandableListView$OnChildClickListener)' on a null object reference

【问题讨论】:

  • 任何崩溃日志?
  • Toast.makeText(thirdLevelq1.put(q1[0] this, "The first child" , Toast.LENGTH_LONG).show(); 这在语法上是错误的
  • 我知道这是错误的,我的意思是我无法在标题中添加适当的主题。我还添加了使用 Toast.makeText(getApplicationContext(), "The first child", Toast.LENGTH_LONG).show(); 的崩溃日志。
  • 你能指出 expandableListView.setOnChildClickListener 部分在 MainAcitvity 中的确切位置吗?
  • 现在编辑并添加了文本,我刚刚从 github 粘贴了相同的 java 文本,我的列表在这里很长,相同的代码但列表的行臃肿。

标签: java android expandablelistview toast multi-level


【解决方案1】:
@Override
public void onFinalChildClick(int plpos, int slpos, int tlpos) {
    String msg = "";
    switch (tlpos) {
        case 0:
            msg = "Shakespear is a good poet";
            break;
        case 1:
            msg = "Earth isn't flat";
            break;
        default:
            msg = "Unknown";
    }
    Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
}

@Override
public void onFinalItemClick(String plItem, String slItem, String tlItem) {
    String inMsg = plItem + ", " + slItem + ", " + tlItem;
    String outMsg = "";
    if (inMsg.equals("group 1, Child Level 1, A")){
        outMsg = "Shakespear is a good poet";
    } else if (inMsg.equals("group 1, Child Level 1, B")){
        outMsg = "Earth isn't flat";
    } else {
        outMsg = "Unknown";
    }
    Toast.makeText(this, outMsg, Toast.LENGTH_SHORT).show();
}

【讨论】:

    【解决方案2】:

    请在初始化expandableListView 之后设置此侦听器expandableListView.setOnChildClickListener,即在您的情况下setUpAdapter() 之后,因为当您尝试设置侦听器时expandableListView 仍然为空,因为您的初始化是在之后。

    这就是NullPointerException 的原因。因为在设置监听器时expandableListView 为空。

    干杯

    【讨论】:

    • 您在回调中获取组位置和子位置,使用它来了解调用了哪个子或组。
    • @Cingen 你必须分享更多你的代码,所以我可以帮助你,写一切假设对我来说太麻烦了。
    • 你可以试试stackoverflow.com/questions/52309469/…。感谢@i_A_mok。 Cingen 如果您仍然无法实现您想要的,请告诉我,我会尽力帮助您。
    • 是的,您可以根据需要使用不同的 toast,您只需要利用回调的 groupPosition 和 childPosition 来获取正确的消息并在您的 Toast 中使用它。
    • 能否请您显示您将在所有三个列表中拥有的数据,我需要将其可视化才能给您确切的答案
    猜你喜欢
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-17
    • 2013-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多