2017-09-06 42 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