Reputation: 117
I am using two ListViews
(List1 has data and List2 is empty).
The user can enter a name as input and if List1 contains name and the add Button
is pressed then marks should be decreased by 1 and both the ListViews
should be updated.
Example:
If List1 has 10 marks and a name is entered then List1 should have marks set to 9 and List2 should have marks set to 1.
If we did this 10 times then List1 names should be removed and List2 has marks set to 10.
Example 2:
Suppose List1 has marks set to 8 and List2 marks set to 2. If the sub button is pressed then both should lists should be added. At this point, List2 should be deleted and List1 should have total marks as 10.
Below is the logic I have used however it is not working it is creating multiple rows and marks which not updating properly.
HomeAct class
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
public class HomeAct extends Activity {
List<DocItem> docDet1 = new ArrayList<DocItem>();
List<DocItem> docDet2 = new ArrayList<DocItem>();
ListView lv1, lv2;
EditText editText;
Button btn1, btn2;
DocDetAdapter adapter1, adapter2;
int n=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.home_act);
lv1 = (ListView)findViewById(R.id.lv_det1);
lv2 = (ListView)findViewById(R.id.lv_det2);
editText = (EditText)findViewById(R.id.editText1);
btn1 = (Button)findViewById(R.id.btn1);
btn2 = (Button)findViewById(R.id.btn2);
adapter1 = new DocDetAdapter(1);
adapter2 = new DocDetAdapter(2);
docDet1.add(new DocItem("1", "john", 20));
docDet1.add(new DocItem("2", "james", 5));
docDet1.add(new DocItem("3", "shaun", 60));
docDet1.add(new DocItem("4", "joy", 10));
docDet1.add(new DocItem("5", "mark", 1));
lv1.setAdapter(adapter1);
lv2.setAdapter(adapter2);
btn1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
for(int j =0;j<docDet1.size();j++){
final DocItem curItem = docDet1.get(j);
if(curItem.name.equals(editText.getText().toString())){
n++;
DocItem docItem = docDet1.get(j);
docDet1.get(j).marks = n;
docDet2.add(0, docItem);
adapter1.notifyDataSetChanged();
adapter2.notifyDataSetChanged();
editText.setText("");
}
}
editText.setText("");
}
});
btn2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
for(int j =0;j<docDet2.size();j++){
final DocItem curItem = docDet2.get(j);
if(curItem.name.equals(editText.getText().toString())){
DocItem docItem = docDet1.get(j);
docDet2.remove(j);
docDet1.add(0, docItem);
adapter1.notifyDataSetChanged();
adapter2.notifyDataSetChanged();
editText.setText("");
}
}
editText.setText("");
}
});
}
private class DocDetAdapter extends BaseAdapter {
int mode; // 1 or 2
public DocDetAdapter(int mode) {
this.mode = mode;
}
@Override
public int getCount() {
if (mode == 1)
return docDet1.size();
else
return docDet2.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(final int position, View convertView,
ViewGroup parent) {
LayoutInflater li = getLayoutInflater();
if (convertView == null)
convertView = li.inflate(R.layout.row_tray_det, null);
TextView tvItemName = (TextView) convertView
.findViewById(R.id.tv_item_name);
TextView tvRack = (TextView) convertView.findViewById(R.id.tv_rack);
TextView tvQty = (TextView) convertView.findViewById(R.id.tv_qty);
DocItem invItem;
if (mode == 1)
invItem = docDet1.get(position);
else
invItem = docDet2.get(position);
tvItemName.setText(invItem.docNo);
tvRack.setText(invItem.name);
tvQty.setText(invItem.marks + "");
return convertView;
}
}
}
DocItem class
public class DocItem {
public String docNo, name;
public Integer marks;
public DocItem(String docNo, String name, Integer marks) {
super();
this.docNo = docNo;
this.name = name;
this.marks = marks;
}
}
home_act.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<EditText
android:id="@+id/editText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10" >
</EditText>
<Button
android:id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="3"
android:text="Add" />
<Button
android:id="@+id/btn2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="3"
android:text="Sub" />
</LinearLayout>
<TextView
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:gravity="center"
android:text="list 1"
android:textSize="20sp"
android:textStyle="bold" >
</TextView>
<ListView
android:id="@+id/lv_det1"
android:layout_width="fill_parent"
android:layout_height="200dp"
android:layout_marginTop="10dp" />
<TextView
android:id="@+id/textView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:gravity="center"
android:text="list 2"
android:textSize="20sp"
android:textStyle="bold" >
</TextView>
<ListView
android:id="@+id/lv_det2"
android:layout_width="fill_parent"
android:layout_height="250dp" />
</LinearLayout>
row_tray_det
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<View
android:id="@+id/v_doc_seperator"
android:layout_width="match_parent"
android:layout_height="4dp"
android:background="@color/blue"
android:visibility="gone" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/row_bg_transparent_white"
android:gravity="center_vertical"
android:orientation="horizontal" >
<TextView
android:id="@+id/tv_rack"
style="@android:style/TextAppearance.Medium"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="5"
android:gravity="center_vertical"
android:padding="10dp"
android:text="Sl no"
android:textStyle="bold" />
<TextView
android:id="@+id/tv_item_name"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center_vertical"
android:text="Name"
android:textSize="15sp"
android:textStyle="bold" />
<TextView
android:id="@+id/tv_qty"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:ems="10"
android:gravity="center_vertical"
android:paddingRight="3dp"
android:text="Marks"
android:textSize="16sp"
android:textStyle="bold" />
</LinearLayout>
Here is an image of the expected output:
In the above output, Joy had 10 marks and if "Joy" is entered as input then list should shown as above.
I could really use help, thanks in advance.
Upvotes: 3
Views: 94
Reputation: 133560
From what i understand if the name entered in editText matches the name in the list reduce marks by 1. Add the same content to the list 2 and set marks as 1.
If you click add for the same name list 1 marks for the name reduces while marks in list2 becomes2.
Changes to be made for the add part
btn1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
DocItem changeItem = null;
for (int i = 0; i < docDet1.size(); i++) {
DocItem docItem = docDet1.get(i);
if (docItem.name.equals(editText.getText().toString())) {
changeItem = docDet1.get(i);
changeItem.marks = changeItem.marks - 1;
if (findDocItem(editText.getText().toString()) != null) {
DocItem docI = findDocItem(editText.getText().toString());
docI.marks = docI.marks + 1;
} else {
docDet2.add(new DocItem(changeItem.docNo, changeItem.name, 1));
}
}
}
adapter2.notifyDataSetChanged();
adapter1.notifyDataSetChanged();
}
});
To find and item
DocItem findDocItem(String name) {
for (DocItem item : docDet2) {
if (item.name.equals(name)) {
return item;
}
}
return null;
}
Avoid calling notifyDataSetChanged
inside the for loop.
You would do something similar for sub.
For the sub part from the discussion in chat
btn2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
int changedmarks=0;
for (int i = 0; i < docDet2.size(); i++) {
DocItem docItem = docDet2.get(i);
if (docItem.name.equals(editText.getText().toString())) {
changedmarks =docDet2.get(i).marks;
docDet2.remove(i);
}
}
if(findDocItem2(editText.getText().toString())!=null )
{
DocItem docitem = findDocItem2(editText.getText().toString());
docitem.marks = docitem.marks+ changedmarks;
}
adapter1.notifyDataSetChanged();
adapter2.notifyDataSetChanged();
}
});
Then
DocItem findDocItem2(String name) {
for (DocItem item : docDet1) {
if (item.name.equals(name)) {
return item;
}
}
return null;
}
Upvotes: 2