2017-09-06 24 views
0

私はこれらのようないくつかの質問を発見した、と私はsetOnItemClickListenerとして使用されるべきであることを得るのです。しかしは、選択可能なカスタムリストビュー

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(); 
     } 

    } 
} 

、Imは、配列をループして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

同様

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 } 


によって方法?私はTextViews – phpdroid

+0

アイデアは、リストビュー内の行を選択することですamacfねえ、あなたの答えをありがとうございました。私は(それらの1つ)で開始するように直面していた問題があった。カントの解決のシンボル「位置」だけでなく、ドリンク。 :( – py9

答えて

1

uは、内の特定の要素にリスナーをアクティブにすることができますのビューあなたがクリックするリスト内の特定の項目または全部の断片またはリスト全体をしたい、この

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つのより多くの質問を受けた。 それがリストビューの行全体を選択して、その中のすべての項目の値を取得することは可能です(この中に?。場合は、tx_ime、cijena、kolicina) 2つ目の質問は、これが理由で失敗した私は、文字列に選択可能な項目を変換するに取り掛かるだろうか、ですが、私は十分にそれを理解しない:https://pastebin.com/J64gn1e5あなたの努力のために再び ありがとう! – py9

+0

あなたは 'RelativeLayout'にIDを与えることができ、あなたはあなたを使用して文字列に変換することができ – phpdroid

+0

クリックされたレイアウトを知っているので、あなたは、このIDを介してすべての子要素を取得カントと仮定などが参照クラスオブジェクトを飲みます私は答えを更新しました – phpdroid

0

あなただけのリストビューに取り付ける、のonCreateメソッドにそのリスナーをウンチすることができるはずです。このような何かを試してみて、私たちは結果を知ってみましょう:。

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

としてそこに設定されているこれらの3つの要素を把握することができる午前、そこから – py9

関連する問題