【问题标题】:setOnItemClickListener don't work on ListView in FragmentsetOnItemClickListener 在片段中的 ListView 上不起作用
【发布时间】:2020-02-28 07:52:24
【问题描述】:

当我单击选项卡 Fragment 1 中的列表视图时,它将无法跳转到下一个活动。我已经在课堂上设置了OnItemClickListener,但仍然无法正常工作。现在我的问题是当我单击列表视图时它不起作用。

public class TabFragment1_Staff extends Fragment {
    ListView lsReport;
    ArrayList<HashMap<String, String>> reportlist;
    public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        return inflater.inflate(R.layout.activity_tab_fragment1__staff, container, false);
    }
    @Override
    public void onActivityCreated(Bundle savedInstanceState){
        super.onActivityCreated(savedInstanceState);
        reportlist = new ArrayList<>();
        lsReport = getActivity().findViewById(R.id.listReport);
        loadReport();
        lsReport.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Intent intent = new Intent(getActivity(),AddStatusDialogWindow.class);
                Bundle bundle = new Bundle();
                Log.e("HANIS",reportlist.get(position).get("reportID"));
                bundle.putString("reportID",reportlist.get(position).get("reportID"));
                bundle.putString("fullName",reportlist.get(position).get("fullName"));
                bundle.putString("icNum",reportlist.get(position).get("icNum"));
                bundle.putString("phoneNum",reportlist.get(position).get("phoneNum"));
                bundle.putString("Rdate",reportlist.get(position).get("Rdate"));
                bundle.putString("Rtime",reportlist.get(position).get("Rtime"));
                bundle.putString("timeName",reportlist.get(position).get("timeName"));
                bundle.putString("typeVehicle",reportlist.get(position).get("typeVehicle"));
                bundle.putString("registrationnum",reportlist.get(position).get("registrationnum"));
                bundle.putString("location",reportlist.get(position).get("location"));
                bundle.putString("brief",reportlist.get(position).get("brief"));
                intent.putExtras(bundle);
                startActivity(intent);
            }
        });
    }
}

tabFragment1.xml

<ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >

            <ListView
                android:id="@+id/listReport"
                android:layout_width="match_parent"
                android:layout_height="300dp"
                android:clickable="false"
                android:focusable="false"
                android:focusableInTouchMode="false"/>

        </LinearLayout>
    </ScrollView>

LoadReport 类

class LoadReport extends AsyncTask<Void, Void, String> {
        @Override
        protected String doInBackground(Void... params) {
            // Perform api call
        }
        @Override
        protected void onPostExecute(String s) {
            reportlist.clear();
                // Parse api response and fill in reportlist var

                ListAdapter adapter = new CustomList_StatusReport(
                        getActivity(), reportlist,
                        R.layout.activity_custom_list__status_report, new String[]
                        {"reportID","fullName","icNum","phoneNum"}, new int[]
                        {R.id.tvReport_ID,R.id.tvCompliantName,R.id.tvCompliantIC,R.id.tvCompliantPhone});
                lsReport.setAdapter(adapter);
              Toast.LENGTH_SHORT).show();
            }
        }
    LoadReport loadReport = new LoadReport();
    loadReport.execute();
}

【问题讨论】:

  • 为什么这个标签是javascript
  • 你能分享一下CustomList_StatusReport代码吗?我认为错误可能在那里

标签: java android android-listview


【解决方案1】:

公共类 CustomList_StatusReport 扩展 SimpleAdapter {

private Context mContext;
public LayoutInflater inflater = null;
public CustomList_StatusReport(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to) {
    super(context, data, resource, from, to);
    mContext = context;
    inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View vi=convertView;
    try {
        if (convertView == null)
            vi = inflater.inflate(R.layout.activity_custom_list__status_report, null);
        HashMap<String, Object> data = (HashMap<String, Object>) getItem(position);
        TextView reportID = vi.findViewById(R.id.tvReport_ID);
        TextView cName = vi.findViewById(R.id.tvCompliantName);
        TextView cIC = vi.findViewById(R.id.tvCompliantIC);
        TextView cPhone =  vi.findViewById(R.id.tvCompliantPhone);

        String id = (String) data.get("reportID");
        String name = (String)data.get("fullName");
        String ic = (String)data.get("icNum");
        String phone = (String)data.get("phoneNum");

        reportID.setText(id);
        cName.setText(name);
        cIC.setText(ic);
        cPhone.setText(phone);
    }catch (IndexOutOfBoundsException e){}
    return vi;
}

【讨论】:

    【解决方案2】:

    在 tabFragment1.xml 中,为什么要使用下面几行代码?

    android:clickable="false"
    android:focusable="false"
    android:focusableInTouchMode="false"
    

    如果不需要,请删除这些,让我们知道是否存在此问题?

    【讨论】:

    • 您是否在线性布局标签中添加了 android:descendantFocusability="blocksDescendants"?
    • 没有。这需要添加到我的线性布局中吗?
    • 不要在 Fragments 中使用 getActivity(),而是使用 requireActivity() 方法。如果 AddStatusDialogWindow.class 是一个 Activity 使用意图进行导航,或者如果它的 Fragment 请使用片段事务进行导航。如果出现任何 logcat 错误,请也发布。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-05
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多