Android - How to handle ratingBar in custom adapter?

时间:2016-12-07 08:32:08

标签: android listview ratingbar

I have a TextView and RatingBar in ListView, and i want to save value of RatingBar on each list in ListView, it is possible with custom adapter??

the code I use to do likes:

PertanyaanAdapter.java

package flix.yudi.pertanyaan3;

import android.app.Activity;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.RatingBar;
import android.widget.TextView;

import java.util.List;

class PertanyaanAdapter extends ArrayAdapter<Pertanyaan> {

    private AppCompatActivity activity;
    private List<Pertanyaan> movieList;

    PertanyaanAdapter(AppCompatActivity context, int resource, List<Pertanyaan> objects) {
        super(context, resource, objects);
        this.activity = context;
        this.movieList = objects;
    }

    @Override
    public Pertanyaan getItem(int position) {
        return movieList.get(position);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

        if (convertView == null) {
            convertView = inflater.inflate(R.layout.item_listview, parent, false);
            holder = new ViewHolder(convertView);
            convertView.setTag(holder);

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

        holder.ratingBar.setOnRatingBarChangeListener(onRatingChangedListener(position));

        holder.ratingBar.setTag(position);
        holder.ratingBar.setRating(getItem(position).getRatingStar());
        holder.movieName.setText(getItem(position).getAsk());

        return convertView;
    }

    private RatingBar.OnRatingBarChangeListener onRatingChangedListener(final int position) {
        return new RatingBar.OnRatingBarChangeListener() {
            @Override
            public void onRatingChanged(RatingBar ratingBar, float v, boolean b) {
                Pertanyaan item = getItem(position);
                assert item != null;
                item.setRatingStar(v);
                Log.i("Adapter", "star: " + v);
            }
        };
    }

    private static class ViewHolder {
        private RatingBar ratingBar;
        private TextView movieName;

        ViewHolder(View view) {
            ratingBar = (RatingBar) view.findViewById(R.id.rate_img);
            movieName = (TextView) view.findViewById(R.id.text);
        }
    }
}

Pertanyaan.java

package flix.yudi.pertanyaan3;
public class Pertanyaan {

    private float ratingStar;
    private String ask;

    Pertanyaan(int ratingStar, String ask) {
        this.ratingStar = ratingStar;
        this.ask = ask;
    }

    float getRatingStar() {
        return 0;
    }

    void setRatingStar(float ratingStar) {
        this.ratingStar = ratingStar;
    }

    public String getAsk() {
        return ask;
    }

}

MainActivity.java

public class MainActivity extends AppCompatActivity {

    ListView listView;
    ArrayList<Pertanyaan> listPertanyaan;
    ArrayAdapter<Pertanyaan> adapter2;
    ProgressDialog pDialog;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView = (ListView)findViewById(R.id.list_view);
        listPertanyaan = new ArrayList<>();
        getpertanyaan get= new getpertanyaan();
        get.execute();
        adapter2 = new PertanyaanAdapter(this, R.layout.item_listview, listPertanyaan);
        listView.setAdapter(adapter2);
    }

    protected void onStart() {
        super.onStart();

    }

    private class getpertanyaan extends AsyncTask<Void, Void, Integer> {
        ArrayList<Pertanyaan> list;
        protected void onPreExecute() {
            pDialog=new ProgressDialog(MainActivity.this);
            pDialog.setTitle("Nama Dosen");
            pDialog.setMessage("Menampilkan nama dosen... Mohon tunggu...!");
            pDialog.setCancelable(false);
            pDialog.show();
            super.onPreExecute();
            list = new ArrayList<>();
        }

        @Override
        protected Integer doInBackground(Void... params) {
            InputStream is = null;
            String result = "";

            try {
                HttpClient httpclient = new DefaultHttpClient();
                HttpPost httppost = new HttpPost("http://flix.16mb.com/send_data.php");
                HttpResponse response = httpclient.execute(httppost);
                HttpEntity entity = response.getEntity();
                // Get our response as a String.
                is = entity.getContent();
            } catch (IOException e) {
                e.printStackTrace();
            }

            //convert response to string
            try {
                BufferedReader reader = null;
                if (is != null) {
                    reader = new BufferedReader(new InputStreamReader(is, "utf-8"));
                }
                String line;
                if (reader != null) {
                    while ((line = reader.readLine()) != null) {
                        result += line;
                    }
                }
                if (is != null) {
                    is.close();
                }
                //result=sb.toString();
            } catch (Exception e) {
                e.printStackTrace();
            }
            // parse json data
            try {
                JSONArray jArray = new JSONArray(result);
                for (int i = 0; i < jArray.length(); i++) {
                    JSONObject jsonObject = jArray.getJSONObject(i);
                    list.add(new Pertanyaan(0,jsonObject.getString("ask")));
                }

            } catch (JSONException e) {
                e.printStackTrace();
            }
            return null;
        }

        protected void onPostExecute(Integer result) {
            if (pDialog.isShowing())
                pDialog.dismiss();
            listPertanyaan.addAll(list);
            adapter2.notifyDataSetChanged();
        }
    }
}

but when I run the app, the RatingBar is untouchable, just each list of ListView is touch however I want to tap the RatingBar.

did I doing something wrong? help me please.

EDIT : item_listview.xml

<RatingBar
        android:id="@+id/rate_img"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/text"
        android:numStars="5"
        android:stepSize="1"
        style="@style/Widget.AppCompat.RatingBar.Indicator" />

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textStyle="bold" />

1 个答案:

答案 0 :(得分:2)

由于您使用的样式,RatingBar是只读的。

style="@style/Widget.AppCompat.RatingBar.Indicator"

将属性android:isIndicator设置为true,这使得表现正常,正如经历的那样。您可以删除该行,或尝试在android:isIndicator

中强制item_listview.xml为false