I want to populate a ListView with different layouts for odd and even rows. It should look like this:
I use two objects "OddListItem" and "EvenListItem" to store/access the data. I do not know how to pass both objects to my custom listview adapter and get the correct view.
My object classes:
public class OddListItem {
private String time_start;
private String time_end;
private String location;
public OddListItem(String time_start, String time_end, String location) {
super();
this.time_start = time_start;
this.time_end = time_end;
this.location = location;
}
// getters and setters
void setTimeStart(String time_start) {
this.time_start = time_start;
}
void setTimeEnd(String time_end) {
this.time_end = time_end;
}
void setLocation(String location) {
this.location = location;
}
public String getTimeStart() {
return time_start;
}
public String getTimeEnd() {
return time_end;
}
public String getLocation() {
return location;
}
}
public class EvenListItem {
private String image;
private String location;
public EvenListItem (String image, String location) {
super();
this.image = image;
this.location = location;
}
// getters and setters
void setImage(String image) {
this.image = image;
}
void setLocation(String location) {
this.location = location;
}
public String getImage() {
return image;
}
public String getLocation() {
return location;
}
}
MyCustomAdapter:
public class MyCustomAdapter extends BaseAdapter {
// Tag for Logging
private static final String TAG = "MyCustomAdapter";
int type;
private static final int TYPE_ITEM = 0;
private static final int TYPE_SEPARATOR = 1;
private static final int TYPE_MAX_COUNT = TYPE_SEPARATOR + 1;
private ArrayList<OddListItem> mData = new ArrayList<OddListItem>();
private LayoutInflater mInflater;
//private TreeSet mSeparatorsSet = new TreeSet();
private Context context;
public MyCustomAdapter(Context context) {
mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.context = context;
}
public void addItem(final OddListItem item) {
mData.add(item);
//The notification is not necessary since the items are not added dynamically
//notifyDataSetChanged();
}
public void addSeparatorItem(final OddListItem item) {
mData.add(item);
//The notification is not necessary since the items are not added dynamically
//notifyDataSetChanged();
}
#Override
public int getItemViewType(int position) {
/*if ((position%2) == 0){
type = TYPE_ITEM;
} else {
type = TYPE_SEPARATOR;
}
return type;*/
return position%2;
}
#Override
public int getViewTypeCount() {
return TYPE_MAX_COUNT;
}
#Override
public int getCount() {
return mData.size();
}
#Override
public OddListItem getItem(int position) {
return mData.get(position);
}
#Override
public long getItemId(int position) {
return position;
}
#Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
int type = getItemViewType(position);
Log.d(TAG, "getView " + position + " " + convertView + " type = " + type);
if (convertView == null) {
holder = new ViewHolder();
switch (type) {
case TYPE_ITEM:
//inflate the new layout
convertView = mInflater.inflate(R.layout.detail_list_row_odd, parent, false);
holder.tv_time_from = (TextView) convertView.findViewById(R.id.tv_time_from);
holder.tv_time_to = (TextView) convertView.findViewById(R.id.tv_time_to);
holder.tv_current_location_odd = (TextView) convertView.findViewById(R.id.tv_current_location_odd);
//fill the layout with values
/*holder.tv_time_from.setText("12:34");
holder.tv_time_to.setText("12:37");
holder.tv_current_location_odd.setText("Aktueller Standort");*/
holder.tv_time_from.setText(mData.get(position).getTimeStart());
holder.tv_time_to.setText(mData.get(position).getTimeEnd());
holder.tv_current_location_odd.setText(mData.get(position).getLocation());
break;
case TYPE_SEPARATOR:
//inflate the new layout
convertView = mInflater.inflate(R.layout.detail_list_row_even, parent, false);
holder.tv_current_location_even = (TextView) convertView.findViewById(R.id.tv_current_location_even);
holder.img_transport = (ImageView) convertView.findViewById(R.id.img_transport);
//fill the layout with values
holder.tv_current_location_even.setText("Hauptbahnhof");
holder.img_transport.setImageDrawable(context.getResources().getDrawable(R.drawable.rollator));
break;
default:
break;
}
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
return convertView;
}
private static class ViewHolder {
public TextView tv_time_from;
public TextView tv_time_to;
public TextView tv_current_location_odd;
public TextView tv_current_location_even;
public ImageView img_transport;
}
}
Here I generate the data and call the adapter:
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detailed_connection);
generateData();
//fill ListView with custom content from MyCustomAdapter class
mAdapter = new MyCustomAdapter(getApplicationContext());
for (int i = 1; i < odd_items.size(); i++) {
mAdapter.addItem(odd_items.get(i));
if (i % 1 == 0) {
mAdapter.addSeparatorItem(odd_items.get(i));
}
}
setListAdapter(mAdapter);
//set duration text
tv_duration = (TextView)findViewById(R.id.tv_duration);
tv_duration.setText("Dauer: 22 Minuten");
}
private void generateData() {
odd_items = new ArrayList<OddListItem>();
odd_items.add(new OddListItem("12:34", "", "Aktueller Standort"));
odd_items.add(new OddListItem("12:37", "12:37", "TUM"));
odd_items.add(new OddListItem("12:42", "12:42", "Hauptbahnhof Nord"));
odd_items.add(new OddListItem("12:48", "12:48", "Hauptbahnhof"));
even_items = new ArrayList<EvenListItem>();
even_items.add(new EvenListItem("R.drawable.rollator", "3 Minuten Fußweg"));
even_items.add(new EvenListItem("R.drawable.bus", "Richtung Hauptbahnhof Nord"));
even_items.add(new EvenListItem("R.drawable.rollator", "6 Minuten Fußweg"));
mData = new Data(odd_items, even_items);
}
Any help would be great. Maybe there is also a better approach then please let me know.
I would create a Single list of Items
public class Items {
private String time_start;
private String time_end;
private String location;
private int image;
private String locationeven;
private int oddoreven;
public String getTime_start() {
return time_start;
}
public void setTime_start(String time_start) {
this.time_start = time_start;
}
public String getTime_end() {
return time_end;
}
public void setTime_end(String time_end) {
this.time_end = time_end;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public int getImage() {
return image;
}
public void setImage(int image) {
this.image = image;
}
public String getLocationeven() {
return locationeven;
}
public void setLocationeven(String locationeven) {
this.locationeven = locationeven;
}
public int getOddoreven() {
return oddoreven;
}
public void setOddoreven(int oddoreven) {
this.oddoreven = oddoreven;
}
}
In onCreate of Activity call
generateData() ;
Then
ArrayList<Items> oddorevenlist = new ArrayList<Items>();
private void generateData() {
Items item1 = new Items();
item1.setTime_start("12:34");
item1.setTime_end("");
item1.setLocation("Aktueller Standort");
item1.setOddoreven(0);
oddorevenlist.add(item1);
Items item2 = new Items();
item2.setImage(R.drawable.ic_launcher);
item2.setLocationeven("3 Minuten Fußweg");
item2.setOddoreven(1);
oddorevenlist.add(item2);
Items item3 = new Items();
item3.setTime_start("12:37");
item3.setTime_end("12:37");
item3.setLocation("Tum");
item3.setOddoreven(0);
oddorevenlist.add(item3);
Items item4 = new Items();
item4.setImage(R.drawable.ic_launcher);
item4.setLocationeven("Richtung Hauptbahnhof Nord");
item4.setOddoreven(1);
oddorevenlist.add(item4);
Items item5 = new Items();
item5.setTime_start("12:42");
item5.setTime_end("12:42");
item5.setLocation("Hauptbahnhof Nord");
item5.setOddoreven(0);
oddorevenlist.add(item5);
Items item6 = new Items();
item6.setImage(R.drawable.ic_launcher);
item6.setLocationeven("R6 Minuten Fußweg");
item6.setOddoreven(1);
oddorevenlist.add(item6);
Items item7 = new Items();
item7.setTime_start("12:48");
item7.setTime_end("12:48");
item7.setLocation("HHauptbahnhof");
item7.setOddoreven(0);
oddorevenlist.add(item7);
MyCustomAdapter mAdapter = new MyCustomAdapter(this,oddorevenlist);
setListAdapter(mAdapter);
}
Adapter code
public class MyCustomAdapter extends BaseAdapter {
// Tag for Logging
private static final String TAG = "MyCustomAdapter";
int type;
private static final int TYPE_ITEM = 0;
private static final int TYPE_SEPARATOR = 1;
private ArrayList<Items> oddorevenlist ;
private LayoutInflater mInflater;
private Context context;
public MyCustomAdapter(Context context, ArrayList<Items> oddorevenlist) {
mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.context = context;
this.oddorevenlist = oddorevenlist;
}
#Override
public int getItemViewType(int position) {
if (oddorevenlist.get(position).getOddoreven()==0){
type = TYPE_ITEM;
} else if (oddorevenlist.get(position).getOddoreven()==1) {
type = TYPE_SEPARATOR;
}
return type;
}
#Override
public int getViewTypeCount() {
return 2;
}
#Override
public int getCount() {
return oddorevenlist.size();
}
#Override
public long getItemId(int position) {
return position;
}
#Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
int type = getItemViewType(position);
Log.d(TAG, "getView " + position + " " + convertView + " type = " + type);
if (convertView == null) {
holder = new ViewHolder();
switch (type) {
case TYPE_ITEM:
//inflate the new layout
convertView = mInflater.inflate(R.layout.row_odd, parent, false);
holder.tv_time_from = (TextView) convertView.findViewById(R.id.tv_time_from);
holder.tv_time_to = (TextView) convertView.findViewById(R.id.tv_time_to);
holder.tv_current_location_odd = (TextView) convertView.findViewById(R.id.tv_current_location_odd);
holder.tv_time_from.setText(oddorevenlist.get(position).getTime_start());
holder.tv_time_to.setText(oddorevenlist.get(position).getTime_end());
holder.tv_current_location_odd.setText(oddorevenlist.get(position).getLocation());
break;
case TYPE_SEPARATOR:
//inflate the new layout
convertView = mInflater.inflate(R.layout.row_even, parent, false);
holder.tv_current_location_even = (TextView) convertView.findViewById(R.id.tv_current_location_even);
holder.img_transport = (ImageView) convertView.findViewById(R.id.img_transport);
//fill the layout with values
holder.tv_current_location_even.setText(oddorevenlist.get(position).getLocationeven());
holder.img_transport.setImageResource(R.drawable.ic_launcher);
break;
default:
break;
}
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
return convertView;
}
private static class ViewHolder {
public TextView tv_time_from;
public TextView tv_time_to;
public TextView tv_current_location_odd;
public TextView tv_current_location_even;
public ImageView img_transport;
}
#Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return position;
}
}
Snap
Related
I have two buttons: + and -. I want that when I click on the button +, the value of the textview present in the fragment class (outside the listview) is changed. How can I do this ?
This is my Adapter class:
public class CartBaseAdapter extends BaseAdapter {
private Context mContext;
private ArrayList<PojoCart> mList;
private ViewHolder viewHolder;
private HashMap<String, Integer> mHashMap = new HashMap<String, Integer>();
private Integer total;
private DataBaseHandler dbh;
private int Id = 1;
private String value1, value2;
private int z;
private FragmentTransactionListener fragmentTransactionListener = (FragmentTransactionListener) new Cart();
public CartBaseAdapter(Context mContext, ArrayList<PojoCart> mList) {
this.mContext = mContext;
this.mList = mList;
dbh = new DataBaseHandler(mContext);
}
#Override
public int getCount() {
return mList.size();
}
#Override
public Object getItem(int position) {
return mList.get(position);
}
#Override
public long getItemId(int position) {
return position;
}
#Override
public View getView(final int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.cart_item, parent, false);
viewHolder = new ViewHolder();
viewHolder.mImgItem = (ImageView) convertView.findViewById(R.id.cart_image);
viewHolder.mTvItemName = (TextView) convertView.findViewById(R.id.tv_item_name);
viewHolder.mTvItemPrice = (TextView) convertView.findViewById(R.id.tv_item_price);
viewHolder.mTvNumber = (TextView) convertView.findViewById(R.id.tv_number);
viewHolder.mBtnAdd = (Button) convertView.findViewById(R.id.btn_add);
viewHolder.mBtnMinus = (Button) convertView.findViewById(R.id.btn_sub);
viewHolder.mImgDelete = (ImageView) convertView.findViewById(R.id.img_del);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
convertView.setTag(viewHolder);
final PojoCart pojoCart = (PojoCart) getItem(position);
viewHolder.mTvItemName.setText(pojoCart.getmItemName());
viewHolder.mTvItemPrice.setText(pojoCart.getmItemPrice());
// viewHolder.mImgDelete.setTag(pojoCart.getmCategoryId());
/* try {
URL url = new URL(pojoCart.getmItemImage());
Bitmap bmp = BitmapFactory.decodeStream(url.openConnection().getInputStream());
viewHolder.mImgItem.setImageBitmap(bmp);
} catch (Exception e) {
e.printStackTrace();
// Log.e("exception", "" + e.getMessage());
}*/
viewHolder.mImgItem.setImageBitmap(Utility.StringToBitMap(pojoCart.getmItemImage()));
viewHolder.mBtnAdd.setTag(pojoCart);
viewHolder.mBtnMinus.setTag(pojoCart);
viewHolder.mTvItemPrice.setTag(pojoCart);
viewHolder.mTvNumber.setTag(pojoCart);
viewHolder.mImgDelete.setTag(position);
if (pojoCart.getmQuantity() > 0) {
viewHolder.mTvNumber.setText("" + pojoCart.getmQuantity());
} else {
viewHolder.mTvNumber.setText("" + 0);
}
viewHolder.mBtnAdd.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
PojoCart pojoCart = (PojoCart) v.getTag();
int mValue = pojoCart.getmQuantity();
mValue++;
viewHolder.mTvNumber.setText("" + mValue);
pojoCart.setmQuantity(mValue);
notifyDataSetChanged();
value1 = viewHolder.mTvNumber.getText().toString();
value2 = pojoCart.getmItemPrice();
int x = Integer.parseInt(value1);
int y = Integer.parseInt(value2);
// viewHolder.Dish_rate.setVisibility(View.GONE);
Log.e("value1", value1);
Log.e("value2", value2);
z = x * y;
pojoCart.setmItemPrice(String.valueOf(z));
Log.e("z", "" + z);
if (x > 2) {
int n = x - 1;
int k = z / n;
Log.e("k", "" + k);
pojoCart.setmItemPrice(String.valueOf(k));
} else {
pojoCart.setmItemPrice(String.valueOf(z));
}
dbh.updateSingleRow(pojoCart.getmCategoryId(), pojoCart.getmItemPrice(), pojoCart.getmQuantity());
int total = dbh.getTotalOfAmount();
pojoCart.setmTotalPrice(total);
}
});
viewHolder.mBtnMinus.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
PojoCart pojoCart = (PojoCart) v.getTag();
int mValue = pojoCart.getmQuantity();
if (mValue > 0) {
mValue--;
viewHolder.mTvNumber.setText("" + mValue);
value1 = viewHolder.mTvNumber.getText().toString();
value2 = pojoCart.getmItemPrice();
int x = Integer.parseInt(value1);
int y = Integer.parseInt(value2);
if (x >= 1) {
Log.e("value11", value1);
Log.e("value22", value2);
int n = x + 1;
Log.e("n", "" + n);
int k = y / n;
Log.e("k", "" + k);
z = k * x;
Log.e("z", "" + z);
pojoCart.setmItemPrice(String.valueOf(z));
} else {
pojoCart.setmItemPrice(pojoCart.getmItemPrice());
}
}
pojoCart.setmQuantity(mValue);
notifyDataSetChanged();
dbh.updateSingleRow(pojoCart.getmCategoryId(), pojoCart.getmItemPrice(), pojoCart.getmQuantity());
pojoCart.setmTotalPrice(dbh.getTotalOfAmount());
}
}
);
viewHolder.mImgDelete.setOnClickListener(
new View.OnClickListener() {
#Override
public void onClick(View view) {
int categoryId = pojoCart.getmCategoryId();
// int id = (Integer) view.getTag();
// id++;
Log.e("removeIdFromTheTable", "" + categoryId);
dbh.delete_byID(categoryId);
mList.remove(position);
notifyDataSetChanged();
pojoCart.setmTotalPrice(dbh.getTotalOfAmount());
}
}
);
return convertView;
}
private class ViewHolder {
TextView mTvItemName, mTvItemPrice, mTvNumber;
ImageView mImgItem, mImgDelete;
Button mBtnAdd, mBtnMinus;
}
}
This is my Fragment Class:
public class Cart extends Fragment implements View.OnClickListener {
private ArrayList<PojoCart> mCartList;
private ListView mListView;
private CartBaseAdapter mCartBaseAdapter;
private DataBaseHandler dbh;
private List<PojoCartDataBase> pojoCartDataBase;
private TextView mTvProcesscheck, mTvTotalPrice;
private String ItemName, ItemPrice;
private String ItemImage;
private ArrayList<String> mTotalPrice;
private Toolbar toolbar;
private int ItemQuantity;
int id = 1;
private String categoryId;
private int sumOfPrice;
private PojoCart pojoCart;
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_cart, container, false);
}
#Override
public void onActivityCreated(#Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
initialize();
// addData();
displayTotalAmount();
try {
getDataFromDatabase();
} catch (IOException e) {
e.printStackTrace();
}
}
private void initialize() {
mTotalPrice = new ArrayList<String>();
mCartList = new ArrayList<PojoCart>();
mListView = (ListView) getActivity().findViewById(R.id.listview_cart);
mCartBaseAdapter = new CartBaseAdapter(getContext(), mCartList);
Parcelable state = mListView.onSaveInstanceState();
mListView.setAdapter(mCartBaseAdapter);
mListView.onRestoreInstanceState(state);
mTvProcesscheck = (TextView) getActivity().findViewById(R.id.tv_checkout);
mTvTotalPrice = (TextView) getActivity().findViewById(R.id.tv_total_price);
toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar);
dbh = new DataBaseHandler(getContext());
mTvProcesscheck.setOnClickListener(this);
toolbar.setTitle("Cart");
mCartBaseAdapter.notifyDataSetChanged();
final RippleView rippleView = (RippleView) getActivity().findViewById(R.id.ripple_view_cart);
rippleView.setOnRippleCompleteListener(new RippleView.OnRippleCompleteListener() {
#Override
public void onComplete(RippleView rippleView) {
Log.d("Sample", "Ripple completed");
Fragment fragment = new LogIn();
getFragmentManager().beginTransaction().replace(R.id.frame, fragment).addToBackStack(null).commit();
toolbar.setTitle("Restaurant List");
}
});
}
/* private void addData() {
for (int i = 0; i < mItemName.length; i++) {
PojoCart pojoCart = new PojoCart();
pojoCart.setmItemName(mItemName[i]);
pojoCart.setmItemPrice(mItemPrice[i]);
pojoCart.setmItemImage(mItemImage[i]);
mCartList.add(pojoCart);
}
// mCartList.add(pojoCartDataBase);
}
*/
private void getDataFromDatabase() throws IOException {
Cursor c = dbh.getAllRows();
if (c.moveToFirst()) {
while (c.isAfterLast() == false) {
// int id = c.getInt(0);
int id = c.getInt(1);
Log.e("id.....", "" + id);
ItemName = c.getString(2);
ItemPrice = c.getString(3);
Log.e("itemname", ItemName);
Log.e("itemprice", ItemPrice);
ItemQuantity = c.getInt(4);
Log.e("itemquantity", "" + ItemQuantity);
ItemImage = c.getString(5);
Log.e("itemimage.........", ItemImage);
pojoCart = new PojoCart();
pojoCart.setmItemName(ItemName);
pojoCart.setmItemPrice(ItemPrice);
pojoCart.setmItemImage(ItemImage);
pojoCart.setmQuantity(ItemQuantity);
pojoCart.setmCategoryId(id);
mCartList.add(pojoCart);
mCartBaseAdapter.notifyDataSetChanged();
c.moveToNext();
}
}
}
#Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.tv_checkout:
/* Fragment fragment = new LogIn();
getFragmentManager().beginTransaction().replace(R.id.frame, fragment).addToBackStack(null).commit();*/
// toolbar.setTitle("Checkout");
}
}
public void displayTotalAmount() {
int total = dbh.getTotalOfAmount();
mTvTotalPrice.setText(String.valueOf(total));
}
}
I want to change the value of the mTvTotalPric (Textview) on click of the button + and -, which is present at the listview. And the textview which the value I want to change is outside the listview.
In your Adapter class create one interface
Adapter.class
public class CartBaseAdapter extends BaseAdapter {
private Context mContext;
private ArrayList<PojoCart> mList;
private ViewHolder viewHolder;
private HashMap<String, Integer> mHashMap = new HashMap<String, Integer>();
private Integer total;
private DataBaseHandler dbh;
private int Id = 1;
private String value1, value2;
private int z;
private FragmentTransactionListener fragmentTransactionListener = (FragmentTransactionListener) new Cart();
private SendDataToFragment sendDataToFragment;
public CartBaseAdapter(FragmentCart fragmentCart, Context mContext, ArrayList<PojoCart> mList) {
this.mContext = mContext;
this.mList = mList;
dbh = new DataBaseHandler(mContext);
sendDataToFragment = (SendDataToFragment) fragmentCart;
}
//Interface to send data from adapter to fragment
public interface SendDataToFragment {
void sendData(String Data);
}
#Override
public int getCount() {
return mList.size();
}
#Override
public Object getItem(int position) {
return mList.get(position);
}
#Override
public long getItemId(int position) {
return position;
}
#Override
public View getView(final int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.cart_item, parent, false);
viewHolder = new ViewHolder();
viewHolder.mImgItem = (ImageView) convertView.findViewById(R.id.cart_image);
viewHolder.mTvItemName = (TextView) convertView.findViewById(R.id.tv_item_name);
viewHolder.mTvItemPrice = (TextView) convertView.findViewById(R.id.tv_item_price);
viewHolder.mTvNumber = (TextView) convertView.findViewById(R.id.tv_number);
viewHolder.mBtnAdd = (Button) convertView.findViewById(R.id.btn_add);
viewHolder.mBtnMinus = (Button) convertView.findViewById(R.id.btn_sub);
viewHolder.mImgDelete = (ImageView) convertView.findViewById(R.id.img_del);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
convertView.setTag(viewHolder);
final PojoCart pojoCart = (PojoCart) getItem(position);
viewHolder.mTvItemName.setText(pojoCart.getmItemName());
viewHolder.mTvItemPrice.setText(pojoCart.getmItemPrice());
viewHolder.mImgItem.setImageBitmap(Utility.StringToBitMap(pojoCart.getmItemImage()));
viewHolder.mBtnAdd.setTag(pojoCart);
viewHolder.mBtnMinus.setTag(pojoCart);
viewHolder.mTvItemPrice.setTag(pojoCart);
viewHolder.mTvNumber.setTag(pojoCart);
viewHolder.mImgDelete.setTag(position);
if (pojoCart.getmQuantity() > 0) {
viewHolder.mTvNumber.setText("" + pojoCart.getmQuantity());
} else {
viewHolder.mTvNumber.setText("" + 0);
}
viewHolder.mBtnAdd.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
//Send data via interface to your fragment
sendDataToFragment.sendData("Your Data");
//Your existing code
}
});
viewHolder.mBtnMinus.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
//Send data via interface to your fragment
sendDataToFragment.sendData("Your Data");
//Your existing code
}
});
return convertView;
}
private class ViewHolder {
TextView mTvItemName, mTvItemPrice, mTvNumber;
ImageView mImgItem, mImgDelete;
Button mBtnAdd, mBtnMinus;
}
}
Inside your fragment implement that interface so as soon as your button is clicked in your adapter you will get the data inside your fragment.
Fragment.class
public class FragmentCart extends Fragment implements
View.OnClickListener, CartBaseAdapter.SendDataToFragment{
#Nullable
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.your_layout, null);
return rootView;
}
#Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
CartBaseAdapter adapter = new CartBaseAdapter(FragmentCart.this, getActivity(), yourList);
}
#Override
public void onClick(View v) {
}
#Override
public void sendData(String Data) {
//set this data to your textView
}
}
Create a interface :
public interface MyListener {
// you can define any parameter as per your requirement
public void callback(View view, int value);
}
In your listview adapter use interface like below on click of button + or - like :
MyListener ml;
ml = (MyListener) context;
ml.callback(this, "success");
In activity implements MyListener than callback method override there and than you get performed action from fragment to activity.
In listview I have a increment and decrement buttons for change the quantity. increasing and decreasing operations are working fine. but quantity will display in array in other activity. please help me i am new to android development. Here first activity and second activity snaps
MainActivity
public class CatalogActivity extends Activity implements CustomButtonListener{
private List<Product> mProductList;
static int quantity2;
/** Called when the activity is first created. */
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.catalog);
// Obtain a reference to the product catalog
mProductList = ShoppingCartHelper.getCatalog(getResources());
// Make sure to clear the selections
for(int i=0; i<mProductList.size(); i++) {
mProductList.get(i).selected = false;
}
// Create the list
ListView listViewCatalog = (ListView) findViewById(R.id.ListViewCatalog);
listViewCatalog.setAdapter(new ProductAdapter(mProductList, getLayoutInflater(), false));
Button viewShoppingCart = (Button) findViewById(R.id.ButtonViewCart);
ProductAdapter.setCustomButtonListener(this);
viewShoppingCart.setOnClickListener(new OnClickListener() {
#Override
public void onClick(View v) {
Intent viewShoppingCartIntent = new Intent(getBaseContext(), ShoppingCartActivity.class);
startActivity(viewShoppingCartIntent);
}
});
}
#Override
public void onButtonClickListener(int position, TextView editText, int value) {
quantity2 = Integer.parseInt(editText.getText().toString());
quantity2 = quantity2+1*value;
if(quantity2<0)
quantity2=0;
editText.setText(quantity2+"");
}
}
Product Adapter
public class ProductAdapter extends BaseAdapter {
private List<Product> mProductList;
private LayoutInflater mInflater;
private boolean mShowQuantity;
public static int quantity = 0;
public Context context;
public static ArrayList<Integer> quantity1 = new ArrayList<Integer>();
static CustomButtonListener customButtonListener;
public static int quant;
public ProductAdapter(List<Product> list, LayoutInflater inflater, boolean showQuantity) {
mProductList = list;
mInflater = inflater;
mShowQuantity = showQuantity;
for (int i = 0; i < list.size(); i++) {
quantity1.add(0);
}
}
public static void setCustomButtonListener(CustomButtonListener customButtonListner) {
customButtonListener = customButtonListner;
}
#Override
public int getCount() {
return mProductList.size();
}
#Override
public Product getItem(int position) {
return mProductList.get(position);
}
#Override
public long getItemId(int position) {
return position;
}
#Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewItem item;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.item, null);
item = new ViewItem();
item.productImageView = (ImageView) convertView
.findViewById(R.id.ImageViewItem);
item.productTitle = (TextView) convertView
.findViewById(R.id.TextViewItem);
item.productQuantity = (TextView) convertView
.findViewById(R.id.textViewQuantity);
item.productCost = (TextView) convertView
.findViewById(R.id.itemcost);
item.productbtn = (Button) convertView.findViewById(R.id.btn_plus);
item.textquanty = (TextView) convertView.findViewById(R.id.num);
item.productbtnminus = (Button) convertView.findViewById(R.id.btn_minus);
item.Layout = (View) convertView.findViewById(R.id.add);
getItem(position).setSelected(false);
convertView.setTag(item);
} else {
item = (ViewItem) convertView.getTag();
}
final Product product = getItem(position);
try {
item.textquanty.setText(quantity1.get(position) + "");
} catch (Exception e) {
e.printStackTrace();
}
item.productbtn.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View arg0) {
if (customButtonListener != null) {
customButtonListener.onButtonClickListener(position, item.textquanty, 1);
quantity1.set(position, quantity1.get(position) + 1);
ShoppingCartHelper.setQuantity(curProduct, quantity1, position);
}
}
});
item.productbtnminus.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View arg0) {
if (customButtonListener != null) {
customButtonListener.onButtonClickListener(position, item.textquanty, -1);
if (quantity1.get(position) > 0)
quantity1.set(position, quantity1.get(position) - 1);
ShoppingCartHelper.setQuantity(curProduct, quantity1, position);
}
}
});
item.productImageView.setImageDrawable(product.productImage);
item.productTitle.setText(product.title);
item.productCost.setText("" + product.price);
if (mShowQuantity) {
item.productQuantity.setText("Quantity: " + ShoppingCartHelper.getProductQuantity(product, position));
item.Layout.setVisibility(View.GONE);
} else {
item.productQuantity.setVisibility(View.GONE);
}
return convertView;
}
public static Integer getProductQuantity(Product product, int position) {
ShoppingCartEntry curEntry = ShoppingCartHelper.cartMap.get(product);
if (curEntry != null)
quant=Integer.parseInt((quantity1.get(position)+""));
return quant;
}
private class ViewItem {
ImageView productImageView;
TextView productTitle;
TextView productQuantity;
TextView productCost;
public Button productbtn;
public Button productbtnminus;
View Layout;
public TextView textquanty;
}
}
Product
public class Product {
public String title;
public Drawable productImage;
public String description;
public double price;
private int quantity;
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
public Product(String title, Drawable productImage, String description,
double price) {
this.title = title;
this.productImage = productImage;
this.description = description;
this.price = price;
}
}
ShoppingCartEntry
public class ShoppingCartEntry {
private Product mProduct;
private ArrayList<Integer> mQuantity;
public ShoppingCartEntry(Product product, ArrayList<Integer> quantity1) {
mProduct = product;
mQuantity = quantity1;
}
public Product getProduct() {
return mProduct;
}
public ArrayList<Integer> getQuantity(int position) {
return mQuantity;
}
public void setQuantity(ArrayList<Integer> quantity1) {
mQuantity = quantity1;
}
}
ShoppingCartHelper
public class ShoppingCartHelper {
public static final String PRODUCT_INDEX = "PRODUCT_INDEX";
protected static List<Product> catalog;
public static Map<Product, ShoppingCartEntry> cartMap = new HashMap<Product, ShoppingCartEntry>();
public static List<Product> getCatalog(Resources res){
if(catalog == null) {
catalog = new Vector<Product>();
catalog.add(new Product("Chiken Curry", res .getDrawable(R.drawable.deadoralive),"Dead or Alive by Tom Clancy with Grant Blackwood", 29.99));
catalog.add(new Product("Mutton Curry", res .getDrawable(R.drawable.switchbook), "Switch by Chip Heath and Dan Heath", 24.99));
catalog.add(new Product("Aloo Curry", res.getDrawable(R.drawable.watchmen), "Watchmen by Alan Moore and Dave Gibbons", 14.99));
catalog.add(new Product("ChikenBiryani", res .getDrawable(R.drawable.deadoralive),"Dead or Alive by Tom Clancy with Grant Blackwood", 25.99));
catalog.add(new Product("MuttonBiryani", res .getDrawable(R.drawable.switchbook), "Switch by Chip Heath and Dan Heath", 21.99));
catalog.add(new Product("Aloo Curry", res.getDrawable(R.drawable.watchmen), "Watchmen by Alan Moore and Dave Gibbons", 12.99));
catalog.add(new Product("Chiken Curry", res .getDrawable(R.drawable.deadoralive),"Dead or Alive by Tom Clancy with Grant Blackwood", 30.99));
catalog.add(new Product("Mutton Curry", res .getDrawable(R.drawable.switchbook), "Switch by Chip Heath and Dan Heath", 28.99));
catalog.add(new Product("Aloo Curry", res.getDrawable(R.drawable.watchmen), "Watchmen by Alan Moore and Dave Gibbons", 18.99));
}
return catalog;
}
public static void setQuantity(Product product, ArrayList<Integer> quantity1, int position) {
// Get the current cart entry
ShoppingCartEntry curEntry = cartMap.get(product);
// If the quantity is zero or less, remove the products
if(ProductAdapter.quantity1.get(position) <= 0) {
if(curEntry != null)
removeProduct(product);
return;
}
// If a current cart entry doesn't exist, create one
if(curEntry == null) {
curEntry = new ShoppingCartEntry(product, quantity1);
cartMap.put(product, curEntry);
return;
}
// Update the quantity
curEntry.setQuantity(quantity1);
}
public static ArrayList<Integer> getProductQuantity(Product product, int position) {
// Get the current cart entry
ShoppingCartEntry curEntry = cartMap.get(product);
if(curEntry != null)
return curEntry.getQuantity(position);
return null;
}
public static void removeProduct(Product product) {
cartMap.remove(product);
}
public static List<Product> getCartList() {
List<Product> cartList = new Vector<Product>(cartMap.keySet().size());
for(Product p : cartMap.keySet()) {
cartList.add(p);
}
return cartList;
}
}
I have an issue in RecycleView. My screen has two tabs, both tabs contain recycleview.It call normally most of the time but sometimes give empty screen. Just I wrote log & system.out and found this issue. I will paste my adapter class code here.
public class ExpandableListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
public static final int HEADER = 0;
public static final int CHILD = 1;
List<ContentTitle> titles;
Context context;
private List<Item> titleData = new ArrayList<Item>();
public ExpandableListAdapter(List<Item> data) {
this.titleData = data;
System.out.println("===this.titleData===" + this.titleData.size());
}
public void replaceContentFragment(String title,int id,int bookmarked) {
try {
SkillsApp SkillsApp = (SkillsApp) context.getApplicationContext();
Fragment fragment = new ContentActivityFragment();
FragmentManager fragmentManager = skillsUSAApp.mainActivity.getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.container_body, fragment);
fragmentTransaction.commit();
SkillsApp.subtitleID = id;
SkillsApp.isbookmark = (bookmarked == 0)? false:true;
SkillsApp.mainActivity.getSupportActionBar().setTitle(title);
SkillsApp.selectedSubtitleID = id;
}catch (Exception e){
e.printStackTrace();
}
}
#Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int type) {
View view = null;
try{
context = parent.getContext();
final SkillsApp skillsApp = (SkillsAApp)context.getApplicationContext();
if(!skillsApp.isDrawer){
switch (type) {
case HEADER:
LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.main_title, parent, false);
ListHeaderViewHolder header = new ListHeaderViewHolder(view);
return header;
case CHILD:
LayoutInflater inflater1 = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater1.inflate(R.layout.sub_title, parent, false);
view.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
Log.d("Child", "child");
TextView text = (TextView) view.findViewById(R.id.header_title);
}
});
return new RecyclerView.ViewHolder(view) {
};
}
}
}catch (Exception e){
e.printStackTrace();
}
return null;
}
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
try{
System.out.println("==========##########");
final Item item = titleData.get(position);
final SkillsAApp skillsAApp = (SkillsAApp)context.getApplicationContext();
System.out.println("===onBindViewHolder item===" + item.mainTitle.title);
switch (item.type) {
case HEADER:
final ListHeaderViewHolder itemController = (ListHeaderViewHolder) holder;
itemController.refferalItem = item;
itemController.header_title.setText(item.mainTitle.title);
if (item.invisibleChildren == null) {
itemController.btn_expand_toggle.setImageResource(R.drawable.right_filled_arrow);
} else {
itemController.btn_expand_toggle.setImageResource(R.drawable.right_filled_arrow);
}
itemController.layoutItem.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
try{
if(!skillsAApp.isDrawer){
if (item.invisibleChildren == null) {
item.invisibleChildren = new ArrayList<Item>();
int count = 0;
int pos = titleData.indexOf(itemController.refferalItem);
while (titleData.size() > pos + 1 && titleData.get(pos + 1).type == CHILD) {
item.invisibleChildren.add(titleData.remove(pos + 1));
count++;
}
notifyItemRangeRemoved(pos + 1, count);
notifyDataSetChanged();
itemController.btn_expand_toggle.setImageResource(R.drawable.right_filled_arrow);
} else {
int pos = titleData.indexOf(itemController.refferalItem);
int index = pos + 1;
for (Item i : item.invisibleChildren) {
titleData.add(index, i);
index++;
}
notifyItemRangeInserted(pos + 1, index - pos - 1);
notifyDataSetChanged();
itemController.btn_expand_toggle.setImageResource(R.drawable.down_arrow);
item.invisibleChildren = null;
}
}
}catch (Exception e){
e.printStackTrace();
}
}
});
break;
case CHILD:
View itemTextView = (View) holder.itemView;
TextView view = (TextView) itemTextView.findViewById(R.id.header_title);
view.setText(titleData.get(position).subtitle.title);
final int pos = position;
itemTextView.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
try{
if(!skillsUSAApp.isDrawer){
TextView text = (TextView) view.findViewById(R.id.header_title);
FlurryAgent.logEvent("Sub Category Item");
replaceContentFragment(text.getText().toString(), titleData.get(pos).subtitle.subtitleId, titleData.get(pos).subtitle.bookMarked);
}
}catch (Exception e){
e.printStackTrace();
}
}
});
break;
}
}catch (Exception e){
e.printStackTrace();
}
}
#Override
public int getItemViewType(int position) {
return titleData.get(position).type;
}
#Override
public int getItemCount() {
return titleData.size();
}
#Override
public long getItemId(int position) {
return position;
}
private static class ListHeaderViewHolder extends RecyclerView.ViewHolder {
public TextView header_title;
public ImageView btn_expand_toggle;
public Item refferalItem;
public RelativeLayout layoutItem;
public ListHeaderViewHolder(View itemView) {
super(itemView);
try{
header_title = (TextView) itemView.findViewById(R.id.header_title);
btn_expand_toggle = (ImageView) itemView.findViewById(R.id.btn_expand_toggle);
layoutItem = (RelativeLayout) itemView.findViewById(R.id.ll_title);
}catch (Exception e){
e.printStackTrace();
}
}
}
public static class Item {
public int type;
public String text;
public ContentTitle mainTitle;
public ContentSubTitle subtitle;
public List<Item> invisibleChildren;
public Item(int type, String text, List<Item> children) {
this.type = type;
this.text = text;
this.invisibleChildren = children;
}
public Item(int type, ContentTitle title,ContentSubTitle stitle) {
this.type = type;
this.mainTitle = title;
this.subtitle=stitle;
}
public Item(int type, String text) {
this.type = type;
this.text = text;
}
}
}
Here is a calling adapter from tab fragment
recyclerview = (RecyclerView) v.findViewById(R.id.recyclerview);
recyclerview.setLayoutManager(new LinearLayoutManager(v.getContext(), LinearLayoutManager.VERTICAL, false));
// recyclerview.setLayoutManager(new LinearLayoutManager(v.getContext()));
ExpandableListAdapter adapter = new ExpandableListAdapter(items);
recyclerview.setAdapter(adapter);
adapter.notifyDataSetChanged();
could you please advice me what is an issue? I didn't get any console error message.Could you please help me anyone here
I am planning to add search to my contacts lists I am working on. I added the searchview textchanged listener, how do I go about this so I can get my search working based on letter of each item in my listview? as in what am i missing?
enum LvType {
HEADER_GROUP,
HEADER_UNGROUPED,
HEADER_twoway_CHAT,
HEADER_MANAGED_CHATROOM,
ITEM_CHATROOM,
ITEM_twoway_CHAT,
ITEM_USER,
}
class ListItemsHolder {
private ArrayList<String> lvJids;
private ArrayList<String> lvNames;
private ArrayList<Presence> lvPresences;
private ArrayList<LvType> lvTypes;
public ListItemsHolder() {
}
public void init() {
lvTypes = new ArrayList<LvType>();
lvJids = new ArrayList<String>();
lvNames = new ArrayList<String>();
lvPresences = new ArrayList<Presence>();
}
public int setInfo(String jid, String name, LvType type, Presence presence) {
lvJids.add(jid);
lvNames.add(name);
lvTypes.add(type);
lvPresences.add(presence);
return lvJids.size();
}
public String getJid (int pos) { return ((lvJids == null) ? null : lvJids.get(pos) ); }
public String getName (int pos) { return ((lvNames == null) ? null : lvNames.get(pos) ); }
public LvType getType (int pos) { return ((lvTypes == null) ? null : lvTypes.get(pos) ); }
public Presence getPresence (int pos) { return ((lvPresences == null) ? null : lvPresences.get(pos)); }
public int getSize() { return (lvJids == null) ? 0 : lvJids.size(); }
}
public class ContactFragment extends RMBaseFragment<MethodsForContactFragment> implements OnItemClickListener, OnItemLongClickListener, ContactInterface,FragmentDrawer.FragmentDrawerListener
, OnClickListener, OnMenuItemClickedListener, Dialog.OnDismissListener,SearchView.OnQueryTextListener,
MainActivity.BackPressListener<android.support.v4.app.Fragment>
{
public final static String TAG_Contact_FRAGMENT = "TAG_Contact_FRAGMENT";
private static final String MY_PRESENCE_DIALOG_FRAGMENT = "MyPresenceDialogFragment";
private RecyclerView m_recycler;
public static ContactFragment newInstance(final FragmentManager manager) {
final ContactFragment fragment = new ContactFragment();
final FragmentInfo fragmentInfo = new FragmentInfo(TransactionMethods.ADD);
fragmentInfo.setFragmentTag(TAG_Contact_FRAGMENT);
fragmentInfo.setActionBarTitle("contact list");
fragmentInfo.setAnimation(R.anim.slide_in_from_right, R.anim.slide_out_to_left);
fragmentInfo.setPopAnimation(R.anim.slide_in_from_left, R.anim.no_animation2);
FragmentStackManager.getInstance().transitionFragment(manager, fragment, fragmentInfo);
return fragment;
}
#Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
}
class ViewHolder {
public TextView text;
public ImageView image;
}
private int numOfConferences = 0;
private int numOfLegacyChats = 0;
private int numOfGroups = 0;
private int numOfUnfiled = 0;
private Vector<BookmarkedConference> mConferences = null;
private Vector<BookmarkedConference> mLegacyChats = null;
private String[] ContactGroupsNames = null;
private TreeMap<String, ContactGroup> treeMapOfContactGroups = null;
//return new TreeMap<String, ContactGroup>(groups).keySet().toArray(new String[0]);
private DrawerLayout mDrawerLayout;
EditText inputSearch;
private int numOfBookmarks = 0;
private Vector mBoomarks = null;
private ListItemsHolder listItemsHolder = new ListItemsHolder();
private static final String twowayChatsHeader = "twoway Chats";
private static final String managedChatroomsHeader = "Managed Chatrooms";
private static final String ungroupedContactsHeader= "Ungrouped Contacts";
private MenuHelper mMenuHelper;
private final ArrayList<String> mMenuItems = new ArrayList<String>();
private ImageView mContextMenuButton;
private ImageView mMyPresenceButton;
private FontTextView mMyPresenceTextView;
private ImageView mContactAccountButton;
private static class MenuItems{
final static String PRESENCE = Application.getAppResources().getString(R.string.rm_news_menu_presence);
final static String LOGOUT = Application.getAppResources().getString(R.string.rm_news_menu_logout);
static final int PRESENCE_POSITION = 0;
static final int LOGOUT_POSITION = 1;
}
private void createMenu() {
mMenuItems.add(MenuItems.PRESENCE);
mMenuItems.add(MenuItems.LOGOUT);
mMenuHelper = new MenuHelper(getActivity(),mMenuItems,this,this);
}
public class MySimpleArrayAdapter extends BaseAdapter {
private final Activity context;
private ItemFilter mFilter;
public MySimpleArrayAdapter(Activity context) {
this.context = context;
prepareDataForListView();
}
private int total;
private void sortDataDefault(wrapper dw) {
if (dw == null)
return;
Contact Contact = dw.getContact();
Hashtable ht;
Vector<ContactEntry> entries;
if (Contact != null && ((ht = Contact.getGroupsEx()) != null) ) {
numOfGroups = Contact.getGroupCount();
treeMapOfContactGroups = new TreeMap<String, ContactGroup>(ht);
ContactGroupsNames = treeMapOfContactGroups.keySet().toArray(new String[0]);
for (int ii = 0; ii < numOfGroups; ii++) {
listItemsHolder.setInfo(ContactGroupsNames[ii], ContactGroupsNames[ii], LvType.HEADER_GROUP, null);
ContactGroup group = Contact.getGroup(ContactGroupsNames[ii]);
entries = group.getEntriesEx();
Collections.sort(entries, comparatorContactEntryAlpha);
Iterator<ContactEntry> it = entries.iterator();
ContactEntry tmpEntry;
while(it.hasNext()) {
tmpEntry = it.next();
listItemsHolder.setInfo(tmpEntry.getUser(), tmpEntry.getName(), LvType.ITEM_USER, Contact.getPresence(tmpEntry.getUser()));
}
}
}
entries = Contact.getUnfiledEntriesEx();
if (entries != null) {
listItemsHolder.setInfo(ungroupedContactsHeader, ungroupedContactsHeader, LvType.HEADER_GROUP, null);
Collections.sort(entries, comparatorContactEntryAlpha);
Iterator<ContactEntry> it = entries.iterator();
ContactEntry tmpEntry;
while(it.hasNext()) {
tmpEntry = it.next();
listItemsHolder.setInfo(tmpEntry.getUser(), tmpEntry.getName(), LvType.ITEM_USER, Contact.getPresence(tmpEntry.getUser()));
}
}
mConferences = dw.getConferences();
if (mConferences != null && mConferences.size() > 0) {
listItemsHolder.setInfo(twowayChatsHeader, twowayChatsHeader, LvType.HEADER_twoway_CHAT, null);
Collections.sort(mConferences, comparatorBookMarksAlpha);
Iterator<BookmarkedConference> it = mConferences.iterator();
BookmarkedConference bk;
while(it.hasNext()) {
bk = it.next();
listItemsHolder.setInfo(bk.getRoomId(), bk.getName(), LvType.ITEM_twoway_CHAT, null);
}
}
mLegacyChats = dw.getLegacyChats(); // mUNitroChatManager.getConferenceBookmarksAsVector(Bookmarks.Type.LEGACY_ROOM);
if (mLegacyChats != null && mLegacyChats.size() > 0) {
listItemsHolder.setInfo(managedChatroomsHeader, managedChatroomsHeader, LvType.HEADER_MANAGED_CHATROOM, null);
Collections.sort(mLegacyChats, comparatorBookMarksAlpha);
Iterator<BookmarkedConference> it = mLegacyChats.iterator();
BookmarkedConference bk;
while(it.hasNext()) {
bk = it.next();
listItemsHolder.setInfo(bk.getRoomId(), bk.getName(), LvType.ITEM_CHATROOM, null);
}
}
}
private void prepareDataForListView() {
numOfConferences = numOfLegacyChats = 0;
mConferences = null;
mLegacyChats = null;
listItemsHolder.init();
try {
sortDataDefault(controller.getContactModel());
}
catch (Exception ex) {
}
}
#Override
public View getView(int position, View convertView, ViewGroup parent) {
View rowView = convertView;
// reuse views
if (rowView == null) {
LayoutInflater inflater = context.getLayoutInflater();
rowView = inflater.inflate(R.layout.my_poc_rowlayout, null);
// configure view holder
ViewHolder viewHolder = new ViewHolder();
viewHolder.text = (TextView) rowView.findViewById(R.id.label);
viewHolder.image = (ImageView) rowView.findViewById(R.id.icon);
rowView.setTag(viewHolder);
}
// fill data
ViewHolder holder = (ViewHolder) rowView.getTag();
String jid = listItemsHolder.getJid(position);
String name = listItemsHolder.getName(position);
holder.image.setVisibility(View.VISIBLE);
switch (listItemsHolder.getType(position)) {
case ITEM_USER:
Status status = MessengerUtils.presence2Status(listItemsHolder.getPresence(position));
if (status == Status.AVAILABLE)
holder.image.setImageResource(R.drawable.online);
else if (status == Status.BUSY)
holder.image.setImageResource(R.drawable.busy);
else if (status == Status.AWAY)
holder.image.setImageResource(R.drawable.away);
else
holder.image.setImageResource(R.drawable.offline);
break;
case ITEM_twoway_CHAT:
holder.image.setImageResource(R.drawable.twoway_chat);
break;
case ITEM_CHATROOM:
holder.image.setImageResource(R.drawable.chatroom);
break;
case HEADER_GROUP: // fall thru
case HEADER_twoway_CHAT: // keep falling
case HEADER_MANAGED_CHATROOM:
holder.image.setVisibility(View.GONE);
break;
default:
//TODO Throw some nasty exception
break;
}
if (name != null && name.length() > 1){
holder.text.setText(name);
ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) holder.text.getLayoutParams();
params.leftMargin = 20;
}else
holder.text.setText(jid);
return rowView;
}
public String firstUpper(String text) {
return (text.substring(0,1).toUpperCase() + text.substring(1).toLowerCase());
}
#Override
public int getCount() {
if (listItemsHolder == null)
return 0;
return listItemsHolder.getSize();
}
#Override
public long getItemId(int position) {
return position;
}
#Override
public Object getItem(int position) {
return null; // don't really need it
}
}
#Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
// Set up search view
inflater.inflate(R.menu.menu_search, menu);
MenuItem item = menu.findItem(R.id.search_messenger);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);
searchView.setOnQueryTextListener(this);
}
#Override
public void onItemClick(final AdapterView<?> parent, final View arg1, final int position, final long id) {
if (listItemsHolder == null) // paranoia
return;
String jid = listItemsHolder.getJid(position);
String name = listItemsHolder.getName(position);
LvType type = listItemsHolder.getType(position);
if (type == LvType.ITEM_USER) {
controller.openChat(jid, name);
mDrawerLayout.closeDrawer(Gravity.RIGHT);
}
}
private ListView listView_Contact;
private TextView empty_tv;
private MySimpleArrayAdapter mAdapter;
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.poc_Contact_fragment, container, false);
mDrawerLayout = (DrawerLayout) view.findViewById(R.id.drawer_layout_messenger);
m_recycler = (RecyclerView)view.findViewById(R.id.recyclerConversations);
m_recycler.setHasFixedSize(true);
m_recycler.setLayoutManager(new LinearLayoutManager(this.getActivity()));
m_recycler.setAdapter(m_recyclerAdapter);
listView_Contact = (ListView)view.findViewById(R.id.listView_Contact);
empty_tv = (TextView)view.findViewById(R.id.empty_tv);
inputSearch = (EditText) view.findViewById(R.id.search_text_messenger);
mAdapter = new MySimpleArrayAdapter(getActivity());
listView_Contact.setAdapter(mAdapter);
listView_Contact.setTextFilterEnabled(true);
listView_Contact.setOnItemClickListener(this);
listView_Contact.setOnItemLongClickListener(this);
//headerView = (HeaderView) view.findViewById(R.id.news_categories_container);
mContextMenuButton = (ImageView) view.findViewById(R.id.context_menu_button);
mContextMenuButton.setOnClickListener(this);
mMyPresenceButton = (ImageView) view.findViewById(R.id.my_presence_button);
mMyPresenceButton.setOnClickListener(this);
mMyPresenceTextView = (FontTextView) view.findViewById(R.id.my_presence_textview);
mMyPresenceTextView.setOnClickListener(this);
setMyPresenceStatus();
mContactAccountButton = (ImageView) view.findViewById(R.id.Contact_contact_button);
mContactAccountButton.setOnClickListener(this);
createMenu();
return view;
}
public void chatMessageReceived(BaseNitroChat chat) {
String from = chat.getName();
String says = chat.getLastMessage().getBody();
Toast.makeText(getActivity(), "" + from + " says " + says, Toast.LENGTH_SHORT).show();
}
#Override
public void ContactModelUpdated() {
if (mAdapter == null)
return;
mAdapter.prepareDataForListView();
mAdapter.notifyDataSetChanged();
m_recyclerAdapter.notifyDataSetChanged();
}
}
#Override
public boolean onQueryTextSubmit(String s) {
return false;
}
#Override
public boolean onQueryTextChange(String s) {
mAdapter.getFilter().filter(s);
return false;
}
}
Now I have a list view with a custom adapter which shows a different layout types.
List view items are repeating in a random manner and I can't figure out the problem.
So, can anybody help please?
Here is my code.
public class NewsFeedAdapter extends BaseAdapter {
private final int IMAGE_COMPARISON = 0;
private final int POLL = 1;
private final int EMO = 2;
private final int TYPE_MAX_COUNT = EMO + 1;
private ArrayList<Post> posts = new ArrayList<Post>();
private ArrayList<Post> originalPosts = new ArrayList<Post>();
private MaterialDialog alert;
private Context context;
private ApiClient apiClient;
private SharedPreferences sharedPreferences;
private int id;
private Bitmap bitmap;
private ArrayList<View> views ;
private Intent sharingIntent;
private String link;
private String type;
public NewsFeedAdapter(Context context, ArrayList<Post> questionItems) {
this.context = context;
this.posts = questionItems;
this.originalPosts = new ArrayList<Post>(posts);
this.apiClient = ApiClient.getInstance(context);
sharedPreferences = context.getSharedPreferences(context.getResources().getStringArray(R.array.preferences)[4], 0);
views = new ArrayList<>();
}
#Override
public int getCount() {
return posts.size();
}
#Override
public Object getItem(int position) {
return posts.get(position);
}
#Override
public long getItemId(int position) {
return position;
}
#Override
public int getViewTypeCount() {
return TYPE_MAX_COUNT;
}
#Override
public int getItemViewType(int position) {
String type = ((Post)getItem(position)).getQ().getType();
if(type.equalsIgnoreCase("radio")){
return POLL;
}else if(type.equalsIgnoreCase("image")){
return IMAGE_COMPARISON;
}else{
return EMO;
}
}
public int getItemViewType(Post post) {
String type = (post).getQ().getType();
if(type.equalsIgnoreCase("radio")){
return POLL;
}else if(type.equalsIgnoreCase("image")){
return IMAGE_COMPARISON;
}else{
return EMO;
}
}
#Override
public View getView(final int position, View convertView, ViewGroup parent) {
int type = getItemViewType(position);
switch (type) {
case IMAGE_COMPARISON:
ImageListRowView imageListRowView;
// if (convertView == null) {
imageListRowView = new ImageListRowView(context, new MenuListener() {
#Override
public void onReceive(MenuItemAction menuItemAction,int position) {
preformMenuAction(menuItemAction, position);
}
});
imageListRowView.setData(posts.get(position));
imageListRowView.setTag(R.string.view_tag,position);
views.add(imageListRowView);
return imageListRowView;
// }
// else
// imageListRowView = (ImageListRowView) convertView;
//return imageListRowView;
{
case EMO:
EmoListRowView emoListRowView;
// if (convertView == null) {
emoListRowView = new EmoListRowView(context, new MenuListener() {
#Override
public void onReceive(MenuItemAction menuItemAction,int position) {
preformMenuAction(menuItemAction, position);
}
});
emoListRowView.setData(posts.get(position));
emoListRowView.setTag(R.string.view_tag,position);
views.add(emoListRowView);
return emoListRowView;
// }
// else
// emoListRowView = (EmoListRowView) convertView;
// return emoListRowView;
case POLL:
PollListRowView pollListRowView;
// if (convertView == null) {
pollListRowView = new PollListRowView(context, new MenuListener() {
#Override
public void onReceive(MenuItemAction menuItemAction,int position) {
preformMenuAction(menuItemAction, position);
}
});
pollListRowView.setData(posts.get(position));
pollListRowView.setTag(R.string.view_tag,position);
views.add(pollListRowView);
return pollListRowView;
}
// else
// pollListRowView = (PollListRowView) convertView;
// return pollListRowView;
}
return convertView;
}
getView() needs to always customize the rows. The only variance based upon whether convertView is null is whether you have to also inflate the rows.
In each of your case blocks, if convertView is not null, you just return convertView without modification.
give a look at the following question.I think your problem resembles this one.
After scrolling listview, listview items getting repeatedly in android