2017-09-06 41 views
0

我发现几个问题,如这些,我也感到我应该使用setOnItemClickListener为:可选择定制的ListView

listView.setOnItemClickListener(new AdapterView.OnItemClickListener(position) { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
      String Value = listView.getItemAtPosition(); 
     } 
    }); 

但是,我不能得到这个工作。它有点棘手,因为我从JSON数组中动态生成listView。

我使用意向的数据作为一个字符串传递给DisplayListView类:

public class DisplayListView extends AppCompatActivity { 
    String response; 
    JSONObject jsonObject; 
    JSONArray jsonArray; 
    DrinksAdapter drinksAdapter; 
    ListView listView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.display_listview_layout); 
     listView = (ListView) findViewById(R.id.listview); 
     drinksAdapter = new DrinksAdapter(this,R.layout.row_layout); 
     listView.setAdapter(drinksAdapter); 
     response = getIntent().getExtras().getString("json_data"); 

     try { 
      jsonObject = new JSONObject(response); 
      jsonArray = new JSONObject(response).getJSONArray("Menu"); 
      //jsonArray = jsonObject.getJSONArray("Menu"); 
      int count = 0; 
      String ime,kolicina,cijena; 


      while(count < jsonArray.length()) { 
       JSONObject JO = jsonArray.getJSONObject(count); 
       ime = JO.getString("ime"); 
       kolicina = JO.getString("kolicina"); 
       cijena = JO.getString("cijena"); 

       Drinks drinks = new Drinks(ime,kolicina,cijena); 
       drinksAdapter.add(drinks); 

       count++; 

      } 


     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

    } 
} 

在上文中,林循环通过阵列和初始化数据通过调用DrinksAdapter

public class DrinksAdapter extends ArrayAdapter { 
    List list = new ArrayList(); 

    public DrinksAdapter(@NonNull Context context, @LayoutRes int resource) { 
     super(context, resource); 
    } 


    public void add(Drinks object) { 
     super.add(object); 
     list.add(object); 
    } 

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

    @Nullable 
    @Override 
    public Object getItem(int position) { 

     return list.get(position); 
    } 

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

     View row; 
     row = convertView; 
     DrinkHolder drinkHolder; 

     if(row == null) { 
      LayoutInflater layoutInflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      row = layoutInflater.inflate(R.layout.row_layout,parent,false); 
      drinkHolder = new DrinkHolder(); 
      drinkHolder.tx_ime = (TextView) row.findViewById(R.id.tx_ime); 
      drinkHolder.tx_kolicina = (TextView) row.findViewById(R.id.tx_kolicina); 
      drinkHolder.tx_cijena = (TextView) row.findViewById(R.id.tx_cijena); 

      row.setTag(drinkHolder); 
     } else { 
      drinkHolder = (DrinkHolder) row.getTag(); 
     } 


     Drinks drinks = (Drinks) this.getItem(position); 
     drinkHolder.tx_ime.setText(drinks.getIme()); 
     drinkHolder.tx_kolicina.setText(drinks.getKolicina()); 
     drinkHolder.tx_cijena.setText(drinks.getCijena()); 
     return row; 

    } 

    static class DrinkHolder { 
     TextView tx_ime,tx_kolicina,tx_cijena; 
    } 

} 

Drinks类正在被用来初始化变量。

我在哪里可以实现这个功能呢?

我知道我有很多东西需要学习,每天我这样做,它看起来像我只是有点停留在此刻:(

任何形式的帮助是高度赞赏。 谢谢!

+0

要被点击或整个片段或整个列表列表中的某一个项目像? – phpdroid

+0

这个想法是选择列表视图中的行,从中我可以找出那三个元素设置为TextViews – py9

回答

1

u能激活某些元素的监听器在的观点方法,通过

drinkHolder.tx_cijena .setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
     //using value of `int position` in `getView` to know which item in the list is clicked 
    } 


public class DrinksAdapter extends ArrayAdapter { 
List list = new ArrayList(); 

public DrinksAdapter(@NonNull Context context, @LayoutRes int resource) { 
    super(context, resource); 
} 


public void add(Drinks object) { 
    super.add(object); 
    list.add(object); 
} 

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

@Nullable 
@Override 
public Object getItem(int position) { 

    return list.get(position); 
} 

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

    View row; 
    row = convertView; 
    DrinkHolder drinkHolder; 

    if(row == null) { 
     LayoutInflater layoutInflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     row = layoutInflater.inflate(R.layout.row_layout,parent,false); 
     drinkHolder = new DrinkHolder(); 
     drinkHolder.tx_ime = (TextView) row.findViewById(R.id.tx_ime); 
     drinkHolder.tx_kolicina = (TextView) row.findViewById(R.id.tx_kolicina); 
     drinkHolder.tx_cijena = (TextView) row.findViewById(R.id.tx_cijena); 

     row.setTag(drinkHolder); 
    } else { 
     drinkHolder = (DrinkHolder) row.getTag(); 
    } 


    final Drinks drinks = (Drinks) this.getItem(position); //make it final 
    drinkHolder.tx_ime.setText(drinks.getIme()); 
    drinkHolder.tx_kolicina.setText(drinks.getKolicina()); 
    drinkHolder.tx_cijena.setText(drinks.getCijena()); 
    drinkHolder.tx_ime.setOnClickListener(new View.OnClickListener() { 

    @Override 
    public void onClick(View view) { 
    //do anything with your **drink** object get any present value 
    Log.i("INFO", drinks.getIme()); // you will log whichever text is clicked in Ime of each list item 
    } 
    } 
    return row; 

} 

static class DrinkHolder { 
    TextView tx_ime,tx_kolicina,tx_cijena; 
} 

} 
+0

非常感谢你为你的努力。它工作得很好。 了2个问题,如果你不介意。 是否有可能选择ListView的整行并在它那里得到的所有项的值(在此?情况下,tx_ime,cijena,kolicina) 第二个问题是,我将如何去可选择项目转换为字符串这失败的一个原因,但我只是不明白这就够了:https://pastebin.com/J64gn1e5再次 感谢你的努力! – py9

+0

像假设你可以给'RelativeLayout'一个id,你不能通过这个id来获取所有子元素,所以你知道哪些布局点击 – phpdroid

+0

你可以通过使用你喝类对象把它转换成字符串我已经更新了答案 – phpdroid

0

你应该能够只是扑通该侦听到onCreate方法,将其连接到ListView尝试这样的事情,让我们知道结果。

public class DisplayListView extends AppCompatActivity { 
    String response; 
    JSONObject jsonObject; 
    JSONArray jsonArray; 
    DrinksAdapter drinksAdapter; 
    ListView listView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.display_listview_layout); 
     listView = (ListView) findViewById(R.id.listview); 
     drinksAdapter = new DrinksAdapter(this,R.layout.row_layout); 
     listView.setAdapter(drinksAdapter); 
     response = getIntent().getExtras().getString("json_data"); 

     try { 
      jsonObject = new JSONObject(response); 
      jsonArray = new JSONObject(response).getJSONArray("Menu"); 
      //jsonArray = jsonObject.getJSONArray("Menu"); 
      int count = 0; 
      String ime,kolicina,cijena; 


      while(count < jsonArray.length()) { 
       JSONObject JO = jsonArray.getJSONObject(count); 
       ime = JO.getString("ime"); 
       kolicina = JO.getString("kolicina"); 
       cijena = JO.getString("cijena"); 

       Drinks drinks = new Drinks(ime,kolicina,cijena); 
       drinksAdapter.add(drinks); 

       count++; 

      } 

     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

     listView.setOnItemClickListener(new AdapterView.OnItemClickListener(position) { 
      @Override 
      public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
       Drink drink = adapterView.getItem(i); 
      } 
     }); 

    } 
} 
+0

嘿amacf,谢谢你的回答。我开始面临的问题(其中之一)是:不能解决符号'位置'以及饮料问题。 :( – py9