2017-02-08 6 views
0

Im пытается сделать активность, которая имеет listview элемента телеги в левой части, а затем список из категорий на центральной стороне, затем gridview продуктов на rightside, который я хочу сделать следующим образом: 1. щелчок элемента в категории listview будет фильтровать продукты на gridview 2. нажатие на элемент gridview будет выполнять другую функцию, например, сохранить в таблицы и показать ее в списке на левой сторонеИспользование listview и gridview в 1 действии, gridview не будет отвечать на элемент, нажмите

как-то я не могу заставить работать onclick, его не ошибка, но ничего не произошло onclick. почему это? если я использую только 1 listview, его работа. это чисто мой код неправильный или мы не можем поместить несколько gridview/listview в 1 активность? OnClick фрагмент кода:

/* LIST BILL */ 
     final ArrayList<Bill> list_bill = getListBill(); 
     final ListView listview_bill = (ListView) findViewById(R.id.order_listing); 
     listview_bill.setAdapter(new BillListAdapter(this, list_bill)); 

     listview_bill.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> a, View v, int position, long id) { 
       Bill mBill = list_bill.get(position); 
       int bill_id = mBill.getID(); 

       Log.d(TAG, "click bill ID:"+bill_id); 
      } 
     }); 

private ArrayList getListBill() 
    { 
     SQLiteDatabase mydatabase = openOrCreateDatabase("posDb",MODE_PRIVATE,null); 
     Cursor resultSet = mydatabase.rawQuery("SELECT * FROM bills",null); 

     ArrayList<Bill> results = new ArrayList<Bill>(); 

     if (resultSet.moveToFirst()) { 
      do { 
       Bill billsData = new Bill(); 
       billsData.setID(resultSet.getInt(0)); 
       billsData.set_bill_no(resultSet.getString(1)); 
       billsData.set_type(resultSet.getString(2)); 
       billsData.set_table(resultSet.getString(3)); 
       billsData.set_qty(resultSet.getInt(4)); 
       billsData.set_amount(resultSet.getString(5)); 
       billsData.set_status(resultSet.getString(6)); 

       //put them into results 
       results.add(billsData); 
      } while (resultSet.moveToNext()); 
     } 

     return results; 
    } 

код адаптера (3 из них имеет аналогичный переходник, поэтому я включить один из них)

public class BillListAdapter extends BaseAdapter { 
    private ArrayList<Bill> listData; 
    private LayoutInflater layoutInflater; 

    public BillListAdapter(Context aContext, ArrayList<Bill> listData) { 
     this.listData = listData; 
     layoutInflater = LayoutInflater.from(aContext); 
    } 

    @Override 
    public int getCount() { 
     return listData.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return listData.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 
     if (convertView == null) { 
      convertView = layoutInflater.inflate(R.layout.list_bill_layout, null); 
      holder = new ViewHolder(); 
      //holder.txtBillNo = (TextView) convertView.findViewById(R.id.txtBillId); 
      holder.txtBillNo = (TextView) convertView.findViewById(R.id.txtBillNo); 
      holder.txtBillType = (TextView) convertView.findViewById(R.id.txtBillType); 
      holder.txtBillTable = (TextView) convertView.findViewById(R.id.txtBillTable); 
      holder.txtBillQty = (TextView) convertView.findViewById(R.id.txtBillQty); 
      holder.txtBillAmount = (TextView) convertView.findViewById(R.id.txtBillAmount); 
      holder.txtBillStatus = (TextView) convertView.findViewById(R.id.txtBillStatus); 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 
     //holder.txtBillId.setText(listData.get(position).getID() +""); 
     holder.txtBillNo.setText(listData.get(position).get_bill_no()); 
     holder.txtBillType.setText(listData.get(position).get_type()); 
     holder.txtBillTable.setText(listData.get(position).get_table()); 
     //holder.txtBillQty.setText(listData.get(position).get_qty()); 
     holder.txtBillAmount.setText(listData.get(position).get_amount()); 
     holder.txtBillStatus.setText(listData.get(position).get_status()); 

     return convertView; 
    } 

    static class ViewHolder { 
     //TextView txtBillId; 
     TextView txtBillNo; 
     TextView txtBillType; 
     TextView txtBillTable; 
     TextView txtBillQty; 
     TextView txtBillAmount; 
     TextView txtBillStatus; 
    } 
} 

ответ

1

установить onClickListener на вашем GridView пункта сделать это.

(предположим, у вас уже есть адаптер для сетки). Внутри адаптера в onBindViewHolder (если вы используете Recyclerview.Adapter) или в getView (если вы используете базовый адаптер), добавьте прослушиватель кликов в свой элемент. например, это ->

holder.yourItem.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // do your work on click here 
     } 
    }); 

надежды, что помогает. :)

+0

im используя gridview, кстати, вместо этого мы используем setOnItemClickListener? если мы определяем щелчок на getView, как получить идентификатор из другого списка? который мне нужно пройти id от щелчка пункта на listview – Gabriel

+0

Это отлично работает :) спасибо! – Gabriel

1

Мы можем использовать несколько GridView и ListView в той же деятельности.

Если вы используете элемент clickable (например, Button или что-либо) в качестве элемента строки в адаптере GridView, это может быть причиной того, что вы не вызываете onItemClick.

установить вашу кнопку кликабельна ложь, а затем попытаться для GridView onItemClick

Это общая проблема для ListView и GridView, если вы использовали какой-либо интерактивный контроль как элемент строки, то не будет выполняться ваш onItemClick.

ИЛИ

Применить ниже атрибута в корневом макете, в котором GridView/ListView, объявленном в макете XML

android:descendantFocusability="blocksDescendants" 

применяется также ниже вашего интерактивное управление в строке XML если

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

См. Также this.

+0

Спасибо @rikin, это решение также хорошо работает – Gabriel