自定义列表视图android中的textview不稳定

时间:2018-09-20 03:23:49

标签: android listview android-adapter

实际上,我有一个自定义列表视图,其中包含一个倒数计时器,该倒数计时器是由处理程序创建的,现在该列表加载正常,一切似乎都正确,但是当我开始滚动时,倒数计时器变得不稳定且值不稳定似乎彼此重叠意味着在第一行中打印了lastrow值,类似的事情是,这些值上下波动并且无法正常工作,此处API发送了一个长值,该值传递给处理程序,处理程序将其转换为到一个倒数计时器,所以问题出在哪里,每当刷新列表时,一切都很好,但是当我开始滚动时,同样的问题再次出现..这是我的代码

public class fixtures extends Fragment {

 private ListView fixtureListView;
 String Balance,userEmail;
 SwipeRefreshLayout mSwipeRefreshLayout;
 private static final String FORMAT = "%02d:%02d:%02d";
 List<ListView_fixture_conveyer> fixture_conveyerList;
 ListView_fixture_conveyer fixtureList;


@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup viewGroup, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fixtures, viewGroup, false);
    fixtureListView = view.findViewById(R.id.fixture_list);
    mSwipeRefreshLayout = view.findViewById(R.id.swipeToRefresh);
    User user = SharedPrefManager.getInstance(getActivity()).getUser();
    userEmail= user.getEmail();
    new JSONTask().execute("http://www.judgement6.com/judgement_files/fixture_json.php");


    DisplayImageOptions options = new DisplayImageOptions.Builder()

            .cacheInMemory(true)
            .cacheOnDisk(true)

            .build();
    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(Objects.requireNonNull(getActivity()))
            .defaultDisplayImageOptions(options)
            .build();
          com.nostra13.universalimageloader.core.ImageLoader.getInstance().init(config);


    mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {

            fixture_conveyerList.clear();
            new JSONTask().execute("http://www.judgement6.com/judgement_files/fixture_json.php");

            mSwipeRefreshLayout.setRefreshing(false);
        }
    });

    return view;
}


@SuppressLint("StaticFieldLeak")
public class JSONTask extends AsyncTask<String, String, List<ListView_fixture_conveyer>> {

    ProgressDialog loading;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        loading = ProgressDialog.show(getActivity(), "loading,please wait...", null, true, true);
    }

    @Override
    protected List<ListView_fixture_conveyer> doInBackground(String... params) {
        HttpURLConnection connection = null;
        BufferedReader reader = null;

        try {

            URL url = new URL(params[0]);
            connection = (HttpURLConnection) url.openConnection();
            connection.connect();

            InputStream stream = connection.getInputStream();
            reader = new BufferedReader(new InputStreamReader(stream));
            StringBuilder buffer = new StringBuilder();
            String line = "";
            while ((line = reader.readLine()) != null) {
                buffer.append(line);
            }


            String finalJson = buffer.toString();
            JSONObject parentObject = new JSONObject(finalJson);
            JSONArray parentArray = parentObject.getJSONArray("list");
            fixture_conveyerList = new ArrayList<ListView_fixture_conveyer>();

            for (int i = 0; i < parentArray.length(); i++) {
                JSONObject finalObject = parentArray.getJSONObject(i);
                Log.e("fixtureObject",finalObject.toString());
                fixtureList = new ListView_fixture_conveyer();
                fixtureList.setTournament(finalObject.getString("tournament"));
                fixtureList.setTeam1_photo(finalObject.getString("team1_photo"));
                fixtureList.setTeam2_photo(finalObject.getString("team2_photo"));
                fixtureList.setTeam1_name(finalObject.getString("team1_name"));
                fixtureList.setTeam2_name(finalObject.getString("team2_name"));
                fixtureList.setTime(finalObject.getString("Time"));
                fixture_conveyerList.add(fixtureList);
            }

            return fixture_conveyerList;

        } catch (IOException | JSONException e) {
            e.printStackTrace();
        } finally {
            if (connection != null) {
                connection.disconnect();
            }
            try {
                if (reader != null) {
                    reader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    @Override
    protected void onPostExecute(List<ListView_fixture_conveyer> result) {
        super.onPostExecute(result);

        if (result !=null) {
            loading.dismiss();
            ListAdapter adapter = new ListAdapter(getActivity(), R.layout.custom_list_fixture, result);
            fixtureListView.setAdapter(adapter);

        }
        else
        {
            Toast.makeText(getActivity(), "No Internet Connection!", Toast.LENGTH_LONG).show();
            loading.dismiss();
        }

}
  }

public class ListAdapter extends ArrayAdapter {

    private List<ListView_fixture_conveyer> fixture_conveyerList;
    private int resource;
    private LayoutInflater inflater;

    ListAdapter(Context context, int resource, List<ListView_fixture_conveyer> objects) {
        super(context, resource, objects);
        fixture_conveyerList = objects;
        this.resource = resource;
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    }

    @Override
    public int getViewTypeCount() {
        return getCount();
    }

    @Override
    public int getItemViewType(int position) {
        return position;
    }

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

        if (convertView == null) {
            convertView = inflater.inflate(resource, null);
        }

        final TextView team1_name,team2_name;
        final TextView tournament,time;
        ImageView team1_photo,team2_photo;

        team1_photo =  convertView.findViewById(R.id.team1);
        team2_photo =  convertView.findViewById(R.id.team2);
        team1_name =  convertView.findViewById(R.id.team1_name);
        team2_name =  convertView.findViewById(R.id.team2_name);
        tournament= convertView.findViewById(R.id.tournament);
        time= convertView.findViewById(R.id.timecounter);
        ImageLoader.getInstance().displayImage(fixture_conveyerList.get(position).getTeam1_photo(), team1_photo);
        ImageLoader.getInstance().displayImage(fixture_conveyerList.get(position).getTeam2_photo(), team2_photo);

        team1_name.setText(fixture_conveyerList.get(position).getTeam1_name());
        team2_name.setText(fixture_conveyerList.get(position).getTeam2_name());
        tournament.setText(fixture_conveyerList.get(position).getTournament());
        time.setText(fixture_conveyerList.get(position).getTime());

        Log.e("mytimer",fixture_conveyerList.get(position).getTime());

        if (!("false").equals(fixture_conveyerList.get(position).getTime())){
            Log.e("inside_mytimer",fixture_conveyerList.get(position).getTime());

        long newValue=Long.parseLong(fixture_conveyerList.get(position).getTime());
        new CountDownTimer(newValue, 1000) {

            @SuppressLint({"DefaultLocale", "SetTextI18n"})
            public void onTick(long millisUntilFinished) {

                time.setText("" + String.format(FORMAT,
                        TimeUnit.MILLISECONDS.toHours(millisUntilFinished),
                        TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished) - TimeUnit.HOURS.toMinutes(
                                TimeUnit.MILLISECONDS.toHours(millisUntilFinished)),
                        TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) - TimeUnit.MINUTES.toSeconds(
                                TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished))));

            }

            public void onFinish() {
                time.setText("Fixture closed");
            }
        }.start();
        }
        else{
            time.setText("Fixture closed");
        }


        return convertView;
    }
    }
 }

这是我的模型课程代码

public class ListView_fixture_conveyer {

private String tournament;
private String team1_photo;
private String team2_photo;
private String team1_name;
private String team2_name;
private String time;

public String getTime() {
    return time;
}

public void setTime(String time) {
    this.time = time;
}



public String getTeam1_name() {
    return team1_name;
}

public void setTeam1_name(String team1_name) {
    this.team1_name = team1_name;
}

public String getTeam2_name() {
    return team2_name;
}

public void setTeam2_name(String team2_name) {
    this.team2_name = team2_name;
}


public String getTournament() {
    return tournament;
}

public void setTournament(String tournament) {
    this.tournament = tournament;
}



public String getTeam1_photo() {
    return team1_photo;
}

public void setTeam1_photo(String team1_photo) {
    this.team1_photo = team1_photo;
}

public String getTeam2_photo() {
    return team2_photo;
}

public void setTeam2_photo(String team2_photo) {
    this.team2_photo = team2_photo;
}

}

1 个答案:

答案 0 :(得分:0)

编辑 (已测试)

--->对于Timer问题,您需要在类中获取时间变量,并使用Handler更新该变量 ,以将其用于重新加载数据。就像

Handler timerHandler = new Handler();
Runnable timerRunnable = new Runnable() {
    @Override
    public void run() {
         for (int i = 0, dataLength = fixture_conveyerList.size(); i < dataLength; i++) {
               ListView_fixture_conveyer item = fixture_conveyerList.get(i);
               item.timeRemaining -= 1000;
         }
        adapter.notifyDataSetChanged();
        timerHandler.postDelayed(this, 1000); //run every Second

    }
};

列表适配器类

  public class ListAdapter extends ArrayAdapter {

    private List<ListView_fixture_conveyer> fixture_conveyerList;
    private int resource;
    private LayoutInflater inflater;
    ViewHolder holder;

    ListAdapter(Context context, int resource, List<ListView_fixture_conveyer> objects) {
        super(context, resource, objects);
        fixture_conveyerList = objects;
        this.resource = resource;
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        timerHandler.postDelayed(timerRunnable, 50);   //start unique timer

    }

    @Override
    public int getViewTypeCount() {
        return getCount();
    }

    @Override
    public int getItemViewType(int position) {
        return position;
    }

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

        if (convertView == null) {
            convertView = inflater.inflate(resource, null);
            holder = new ViewHolder();
            holder.team1_photo = convertView.findViewById(R.id.team1);
            holder.team2_photo = convertView.findViewById(R.id.team2);
            holder.team1_name = convertView.findViewById(R.id.team1_name);
            holder.team2_name = convertView.findViewById(R.id.team2_name);
            holder.tournament = convertView.findViewById(R.id.tournament);
            holder.time = convertView.findViewById(R.id.timecounter);
            convertView.setTag(holder);

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


        ImageLoader.getInstance().displayImage(fixture_conveyerList.get(position).getTeam1_photo(), holder.team1_photo);
        ImageLoader.getInstance().displayImage(fixture_conveyerList.get(position).getTeam2_photo(), holder.team2_photo);
        holder.team1_name.setText(fixture_conveyerList.get(position).getTeam1_name());
        holder.team2_name.setText(fixture_conveyerList.get(position).getTeam2_name());
        holder.tournament.setText(fixture_conveyerList.get(position).getTournament());
        holder.time.setText(fixture_conveyerList.get(position).timeRemaining);

        Log.e("mytimer", fixture_conveyerList.get(position).getTime());

        if (!("false").equals(fixture_conveyerList.get(position).getTime())) {
            Log.e("inside_mytimer", fixture_conveyerList.get(position).getTime());

            long newValue = fixture_conveyerList.get(position).timeRemaining;
         if (newValue > 0) {

            holder.time.setText(String.format(FORMAT,
                    TimeUnit.MILLISECONDS.toHours(newValue),
                    TimeUnit.MILLISECONDS.toMinutes(newValue) - TimeUnit.HOURS.toMinutes(
                            TimeUnit.MILLISECONDS.toHours(newValue)),
                    TimeUnit.MILLISECONDS.toSeconds(newValue) - TimeUnit.MINUTES.toSeconds(
                            TimeUnit.MILLISECONDS.toMinutes(newValue))));
        } else {
           holder.time.setText("Fixture closed");
        }



        } else {
            holder.time.setText("Fixture closed");
        }


        return convertView;
    }
}