umano / MultiItemRowListAdapter

MultiItemRowListAdapter
Apache License 2.0
357 stars 103 forks source link

Can't get only one item with onItemClick #4

Closed krosty4782 closed 10 years ago

krosty4782 commented 10 years ago

Hello. I want to add a listner for each item inside my row. The problem is that, getItemPostion returns an array of the items that are in the row, so it's impossible for me to know, what item was really selected. How can i solve this problem ? Thanks

tokudu commented 10 years ago

Have your original adapter needs to handle onClick events for each one of the items.

krosty4782 commented 10 years ago

Thanks for your answer. Im doing this:

mAdapter = new PaisListAdapter(context,paises);

    int spacing = (int)getResources().getDimension(R.dimen.rows_spacing_adapater);
        int itemsPerRow = getResources().getInteger(R.integer.items_per_row);
        wrapperAdapter = new MultiItemRowListAdapter(this, mAdapter, itemsPerRow, spacing);
        ListView lv = (ListView)findViewById(R.id.listPaises);
        lv.setAdapter(wrapperAdapter); // I have also tried with lv.setAdapter(mAdapter);
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {

              @Override
              public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {

                    Intent myIntent = new Intent(ListPaisActivity.this, TweetsPaisActivity.class);
                    Bundle b = new Bundle();
                    b.putString("pais", ((Pais)wrapperAdapter.getItem(position)).getNombre());
                    myIntent.putExtras(b); //Optional parameters
                    ListPaisActivity.this.startActivity(myIntent);

              }

            });  

Can you give me a hint? THanks

tokudu commented 10 years ago

I added a demo in https://github.com/umano/MultiItemRowListAdapter/commit/6a9633954d80fb69645fc1c092e0f74c3cd901f1. Enjoy.

krosty4782 commented 10 years ago

Thank you. I have checked the code and i 've maded similar to yours. But the problem now is the "onItemClick" event is not beeing called. Here is my code:

public class ListPaisActivity extends Activity implements OnItemClickListener { public static Context context ; static PaisListAdapter mAdapter; static MultiItemRowListAdapter wrapperAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_list_pais); context = this; Dbhelper dbh = new Dbhelper(this); List paises = dbh.getListPaises(); mAdapter = new PaisListAdapter(context,paises); mAdapter.setOnItemClickListener(this);

    int spacing = (int)getResources().getDimension(R.dimen.rows_spacing_adapater);
        int itemsPerRow = getResources().getInteger(R.integer.items_per_row);
        wrapperAdapter = new MultiItemRowListAdapter(this, mAdapter, itemsPerRow, spacing);
        ListView lv = (ListView)findViewById(R.id.listPaises);
        lv.setAdapter(wrapperAdapter);
       /* lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {

              @Override
              public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {

                    Intent myIntent = new Intent(ListPaisActivity.this, TweetsPaisActivity.class);
                    Bundle b = new Bundle();
                    b.putString("pais", ((Pais)wrapperAdapter.getItem(position)).getNombre());
                    myIntent.putExtras(b); //Optional parameters
                    ListPaisActivity.this.startActivity(myIntent);

              }

            });  */
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.list_pais, menu);
    return true;
}

@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
    // TODO Auto-generated method stub

     if (mAdapter != null) {          

            Toast t = Toast.makeText(this, "Clicked " + ((Pais)mAdapter.getItem(position)).getNombre(), Toast.LENGTH_SHORT);
            t.show();
        }

}

}

krosty4782 commented 10 years ago

I finally did it.

I left the code, for somebody else:

public class ListPaisActivity extends Activity implements OnItemClickListener { public static Context context ; public static PaisListAdapter mAdapter; static MultiItemRowListAdapter wrapperAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_list_pais); context = this; Dbhelper dbh = new Dbhelper(this); List paises = dbh.getListPaises(); mAdapter = new PaisListAdapter(context,paises); mAdapter.setOnItemClickListener(this);

    int spacing = (int)getResources().getDimension(R.dimen.rows_spacing_adapater);
        int itemsPerRow = getResources().getInteger(R.integer.items_per_row);
        wrapperAdapter = new MultiItemRowListAdapter(this, mAdapter, itemsPerRow, spacing);
        ListView lv = (ListView)findViewById(R.id.listPaises);
        lv.setAdapter(wrapperAdapter);
       /* lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {

              @Override
              public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {

                    Intent myIntent = new Intent(ListPaisActivity.this, TweetsPaisActivity.class);
                    Bundle b = new Bundle();
                    b.putString("pais", ((Pais)wrapperAdapter.getItem(position)).getNombre());
                    myIntent.putExtras(b); //Optional parameters
                    ListPaisActivity.this.startActivity(myIntent);

              }

            });  */
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.list_pais, menu);
    return true;
}

@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
    // TODO Auto-generated method stub

     if (mAdapter != null) {          

            Toast t = Toast.makeText(this, "Clicked " + ((Pais)mAdapter.getItem(position)).getNombre(), Toast.LENGTH_SHORT);
            t.show();
        }

}

}

public class PaisListAdapter extends BaseAdapter implements OnItemClickListener { private Context _context; private List _listPais; // header titles private OnItemClickListener mOnItemClickListener;

public PaisListAdapter(Context context, List<Pais> listPais) {
    this._context = context.getApplicationContext();
    this. _listPais = listPais;

}

public PaisListAdapter(Context context){
    this._context = context.getApplicationContext();

}

public void setListPais(List<Pais> listPais) {
    this._listPais = listPais;

}

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

    String headerTitle = ((Pais) getItem(position)).getNombre();        
    int paisFoto= ((Pais) getItem(position)).getImagenId();

    if (convertView == null) {
        LayoutInflater infalInflater = (LayoutInflater) this._context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = infalInflater.inflate(R.layout.pais_item, null);
    }

    TextView txtVPaisNombre = (TextView) convertView.findViewById(R.id.paisNombre);       
    ImageView imgVPaisFoto = (ImageView) convertView.findViewById(R.id.imageeViewPais);
    txtVPaisNombre.setTypeface(null, Typeface.BOLD);
    txtVPaisNombre.setText(headerTitle);

  //  imgVPaisFoto.setImageBitmap(paisFoto);
    final View clickedView = convertView;

    convertView.setOnClickListener( new OnClickListener() {
        @Override
        public void onClick(View v) {
              if (mOnItemClickListener != null) {
                mOnItemClickListener.onItemClick(null, clickedView, position, position);
            }

        }
    });

  //  convertView.setOnClickListener();

    try{
    imgVPaisFoto.setImageResource(paisFoto);

    }

    catch(Exception e){

    }

    return convertView;
}

@Override
public boolean hasStableIds() {
    return false;
} 

@Override
public int getCount() {
    // TODO Auto-generated method stub
    return _listPais.size();
}

@Override
public Object getItem(int arg0) {
    return _listPais.get(arg0);

}

@Override
public long getItemId(int arg0) {
    // TODO Auto-generated method stub
    return 0;
}

public void remove(int position) {
    _listPais.remove(position);
}   

public List<Pais> getList(){
    return _listPais;

}

 public void setOnItemClickListener(OnItemClickListener listener) {
     mOnItemClickListener = listener;
 }

 @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
        // TODO Auto-generated method stub

         if (ListPaisActivity.mAdapter != null) {          

                Toast t = Toast.makeText(ListPaisActivity.context, "Clicked " + ((Pais)ListPaisActivity.mAdapter.getItem(position)).getNombre(), Toast.LENGTH_SHORT);
                t.show();
            }

    }

}

Thanks

angyy10 commented 10 years ago

Thanks for providing the coding above, it solve the problem.

alessandrosilva commented 9 years ago

Thanks! this code save some day of code!!!