ListView与列表项中的按钮

时间:2016-07-17 14:07:33

标签: java android xml listview android-studio

我有一个带有两个按钮的列表视图(减号和加号)。当我按下按钮时,textview中的list item将被修改。问题是如果我按下按钮并滚动,将会有其他文本视图随机修改。 如果我按下第一个项目列表上的加号图像,将影响第一个项目列表和我将滚动后可见的第一个项目。等等 我将发布以下所有代码。

DetaliiRestaurantActivity.java:

import android.app.ProgressDialog;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.ListView;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

public class DetaliiRestaurantActivity extends AppCompatActivity {
public static final int CONNECTION_TIMEOUT=10000;
public static final int READ_TIMEOUT=15000;
public String passedID=null;
public String passedNume=null;
public int nrprodus=1;
public static StringBuilder comanda = new StringBuilder();
ArrayList<SearchResults> results = new ArrayList<SearchResults>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_detalii_restaurant);

    passedID = getIntent().getExtras().getString("ID");
    passedNume = getIntent().getExtras().getString("Nume");

    TextView Nume = (TextView)findViewById(R.id.textViewTitluRestaurant);
    Nume.setText(passedNume);

    lista();

}
private void lista()
{

    while(tip<10) {
        new AsyncLogin().execute(passedID, String.valueOf(tip));
        tip++;
    }
    final ListView lv = (ListView) findViewById(R.id.products_listview);
    lv.setAdapter(new MyCustomBaseAdapter(this, results));

}
private class AsyncLogin extends AsyncTask<String, String, String>
{
    ProgressDialog pdLoading = new ProgressDialog(DetaliiRestaurantActivity.this);
    HttpURLConnection conn;
    URL url = null;
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        Log.d("DetaliiRestaurant", "12");

        //this method will be running on UI thread
        pdLoading.setMessage("\tLoading...");
        pdLoading.setCancelable(false);
        pdLoading.show();
    }
    @Override
    protected String doInBackground(String... params) {
        try {

            // Enter URL address where your php file resides
            url = new URL("http://192.168.0.105/aplications_scripts/meniu.inc.php");

        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return "exception";
        }
        try {
            // Setup HttpURLConnection class to send and receive data from php and mysql
            conn = (HttpURLConnection)url.openConnection();
            conn.setReadTimeout(READ_TIMEOUT);
            conn.setConnectTimeout(CONNECTION_TIMEOUT);
            conn.setRequestMethod("POST");

            // setDoInput and setDoOutput method depict handling of both send and receive
            conn.setDoInput(true);
            conn.setDoOutput(true);

            // Append parameters to URL
            Uri.Builder builder = new Uri.Builder()
                    .appendQueryParameter("id", params[0])
                    .appendQueryParameter("tip", params[1]);
            String query = builder.build().getEncodedQuery();

            // Open connection for sending data
            OutputStream os = conn.getOutputStream();
            BufferedWriter writer = new BufferedWriter(
                    new OutputStreamWriter(os, "UTF-8"));
            writer.write(query);
            writer.flush();
            writer.close();
            os.close();
            conn.connect();

        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
            return "exception";
        }

        try {

            int response_code = conn.getResponseCode();

            // Check if successful connection made
            if (response_code == HttpURLConnection.HTTP_OK) {

                // Read data sent from server
                InputStream input = conn.getInputStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(input));
                StringBuilder result = new StringBuilder();
                String line;
                Log.d("DetaliiRestaurant", "13");

                while ((line = reader.readLine()) != null) {
                    result.append(line);
                }

                // Pass data to onPostExecute method
                return(result.toString());

            }else{

                return("unsuccessful");
            }

        } catch (IOException e) {
            e.printStackTrace();
            return "exception";
        } finally {
            conn.disconnect();
        }
    }

    @Override
    protected void onPostExecute(String result) {
        //this method will be running on UI thread

        pdLoading.cancel();

        String[] a = new String[60];
        a = result.split("ENDOFONE");

        String[] tipuri = new String[60];
        if(a[0].equalsIgnoreCase("true")) {

            tipuri = a[1].split("ENDOFORDER");

            int x=tipuri.length;
            int i=0;

            String[] detalii = new String[60];

            while(i<x)
            {
                detalii = tipuri[i].split("END");
                SearchResults sr = new SearchResults();

                sr.setName(detalii[0]);
                sr.setIngrediente(detalii[1]);
                sr.setPret(detalii[2]);
                results.add(sr);
                i++;
            }
        }
    }
}

}

SearchResults.java:

 public class SearchResults {
private String name = "";
private String pret = "";
private String ingrediente = "";
private String cantitate = "";

public void setName(String name) {
    this.name = name;
}

public String getName() {
    return name;
}


public void setPret(String pret) {
    this.pret = pret;
}

public String getPret() {
    return pret;
}


public void setIngrediente(String ingrediente) {
    this.ingrediente = ingrediente;
}

public String getIngrediente() {
    return ingrediente;
}

public void setCantitate(String cantitate) {
    this.cantitate = cantitate;
}

public String getCantitate() {
    return cantitate;
}

}

MyCustomAdapter.java:

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.TextView;

import java.util.ArrayList;

public class MyCustomBaseAdapter extends BaseAdapter {
private static ArrayList<SearchResults> searchArrayList;
private LayoutInflater mInflater;
protected ListView mListView;

public MyCustomBaseAdapter(Context context, ArrayList<SearchResults> results) {
    searchArrayList = results;
    mInflater = LayoutInflater.from(context);
}

public int getCount() {
    return searchArrayList.size();
}

public Object getItem(int position) {
    return searchArrayList.get(position);
}

public long getItemId(int position) {
    return position;
}

static class ViewHolder {
    TextView txtNumeProdus;
    TextView txtPret;
    TextView txtIngrediente;
    ImageButton imageButtonMinus;
    ImageButton imageButtonPlus;
}

public View getView(final int position, View convertView, ViewGroup parent) {
    ViewHolder holder=null;

    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.list_item, null);
        holder = new ViewHolder();
        holder.txtNumeProdus = (TextView) convertView.findViewById(R.id.NumeProdus);
        holder.txtPret = (TextView) convertView
                .findViewById(R.id.pret);
        holder.txtIngrediente = (TextView) convertView.findViewById(R.id.ingrediente);
        holder.imageButtonMinus = (ImageButton) convertView.findViewById(R.id.cart_minus_img);
        holder.imageButtonPlus = (ImageButton) convertView.findViewById(R.id.cart_plus_img);

        final View finalview = convertView;

        holder.imageButtonMinus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Log.d("DetaliiRestaurant", "minus");
                Log.d("poz", String.valueOf(position));
                final TextView textview = (TextView) finalview.findViewById(R.id.cart_product_quantity_tv);
                int x= Integer.parseInt(textview.getText().toString());
                Log.d("DetaliiRestaurant", String.valueOf(x));
                if(x>0) {
                    x = x - 1;
                    textview.setText(String.valueOf(x));
                }

            }
        });
        holder.imageButtonPlus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d("DetaliiRestaurant", "plus");
                Log.d("poz", String.valueOf(position));
                final TextView textview = (TextView) finalview.findViewById(R.id.cart_product_quantity_tv);
                int x= Integer.parseInt(textview.getText().toString());
                Log.d("DetaliiRestaurant", String.valueOf(x));
                x=x+1;
                textview.setText(String.valueOf(x));
            }
        });

        convertView.setTag(holder);
        finalview.setTag(holder);
        convertView.setTag(R.id.cart_minus_img, holder.imageButtonMinus);
        convertView.setTag(R.id.cart_plus_img, holder.imageButtonPlus);


    } else {
        holder = (ViewHolder) convertView.getTag();

    }

    holder.imageButtonMinus.setTag(position); // This line is important.
    holder.imageButtonPlus.setTag(position);

    holder.txtNumeProdus.setText(searchArrayList.get(position).getName());
    holder.txtPret.setText(searchArrayList.get(position)
            .getPret());
    holder.txtIngrediente.setText(searchArrayList.get(position).getIngrediente());

    return convertView;
}
}

我知道......这是很多鳕鱼......我的应用程序已经被困在这里3天了。我搜索了很多,但我找不到任何解决方案。

这是它的外观:

1 个答案:

答案 0 :(得分:0)

这里是我的示例适配器,根据您的数据模型修改此适配器(SearchResults.java

mydir = os.path.join('c:/','....')
os.makedirs(mydir)    
with open('mydir', 'w') as stdout_file:
            k = run("Login.robot", 
                     variable=['USERNAME:testuser@fakemail.com'],
                     stdout=stdout_file)

认为你应该专心,

1)不要在OnClick()方法中更改TextView的值,而是可以使用list.set(int index,Object value)修改list的值。

2)在列表调用notifyDataSetChanged()中更新数据后;更新适配器

希望这会对你有所帮助。