【问题标题】:I am using JSON for displaying images in image slider. But its not displaying all images我正在使用 JSON 在图像滑块中显示图像。但它没有显示所有图像
【发布时间】:2018-02-24 06:37:20
【问题描述】:

这是 Json 应该显示下一组图像的主要 java 代码

图像动态显示在图像滑块中。前 10 组将显示,在 10 幅图像结束时,应显示接下来的 10 幅图像。但是这不起作用。

这是我的Article.java

public class Article extends AppCompatActivity {
    ViewPager viewPager;
    static SimpleAdapter adapter;
    static int startIndex;
    ArrayList<ArrayList<String>> arrayList;
   //int images[] = {R.drawable.image_1, R.drawable.image_2, R.drawable.image_3, R.drawable.image_4};

    MyCustomPagerAdapter myCustomPagerAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.article);
        viewPager = (ViewPager) findViewById(R.id.viewPager);
        arrayList=new ArrayList<>();
        new Article.json(startIndex).execute();

        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        Toast.makeText(Article.this, ""+position+"--"+positionOffset+"--"+positionOffsetPixels, Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onPageSelected(int position) {}

            @Override
            public void onPageScrollStateChanged(int state) {}
        });

    }


    @SuppressLint("StaticFieldLeak")
    class json extends AsyncTask<Void,Void,ArrayList<ArrayList<String>>> {
        ProgressDialog pDialog;
        int startIndex;

        public json(int startIndex) {
            this.startIndex=startIndex;
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();

            pDialog = new ProgressDialog(Article.this);
            pDialog.setTitle("Contacting Servers");
            pDialog.setMessage("Logging in ...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }

        @Override
        protected ArrayList<ArrayList<String>> doInBackground(Void... voids) {

            UserFunctions userFunction = new UserFunctions();
            arrayList.addAll(userFunction.getArticle(startIndex));
            try
            {
                Log.e("aaa",arrayList.toString());
            } catch (Exception ex) {

            }

            return arrayList;
        }

        @Override
        protected void onPostExecute(ArrayList<ArrayList<String>> arrayList) {
            try {
                //adapter.notifyDataSetChanged();

                myCustomPagerAdapter = new MyCustomPagerAdapter(Article.this, arrayList);
                viewPager.setAdapter(myCustomPagerAdapter);
            } catch (Exception e) {Log.e("err",e+"error 1234567890");


            } pDialog.dismiss();
        }
    }


    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.END)) {
            drawer.closeDrawer(GravityCompat.END);
        }
    }
  }

我正在使用 MycustomPagerAdapter.java 的自定义适配器 java 类

  import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;

import com.squareup.picasso.Picasso;

import java.util.ArrayList;

public class MyCustomPagerAdapter extends PagerAdapter{
    Context context;
    ArrayList<ArrayList<String>> images;
    LayoutInflater layoutInflater;

    public MyCustomPagerAdapter(Context context, ArrayList<ArrayList<String>> images) {
        this.context = context;
        this.images = images;
        layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        return images.size();
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == ((LinearLayout) object);
    }

    @Override
    public Object instantiateItem(ViewGroup container, final int position) {
        View itemView = layoutInflater.inflate(R.layout.item, container, false);
        ImageView imageView = (ImageView) itemView.findViewById(R.id.imageView);
        TextView textView = (TextView) itemView.findViewById(R.id.textView2);
        //imageView.setImageResource(images[position]);
        Picasso.with(context).load("http://www.northmadras.com/upload/Articles/"+images.get(position).get(0)).into(imageView);
        textView.setText(images.get(position).get(1));
        Log.e("img","http://www.northmadras.com/upload/Articles/"+images.get(position).get(1));
        container.addView(itemView);

        //listening to image click
        imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                context.startActivity(new Intent(context,ArticleContent.class));
            }
        });

        return itemView;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((LinearLayout) object);
    }
}

【问题讨论】:

  • 你说只显示前10个数据,后10个数据不显示?
  • 是的,在 10 张图片的末尾没有加载
  • 可以设置日志 :@Override public int getCount() { Log.i("tag","size::"+article.size()) return article.size(); } 消耗大小为 10 或 20。
  • 我已经完成了您提到的更改。但它不起作用
  • 您可能拥有相同的实现,并使用RecyclerView 进行更好的控制。请看下面我的答案。

标签: java android json android-recyclerview


【解决方案1】:

据我了解,您想先显示前 10 张图像,然后在滑到第 10 张图像的末尾时再显示接下来的 10 张图像。

如果我正确理解了问题,您需要使用RecyclerView 来显示图像并稍微修改您的CustomArticleAdapter.java 并在其中添加pageNumber 变量。所以修改后的适配器将如下所示。

public class CustomArticleAdapter extends BaseAdapter {

    Context context;
    ArrayList<HashMap<String, String>> article;
    LayoutInflater layoutInflater;
    int pageNumber;

    public CustomArticleAdapter(Context context, ArrayList<HashMap<String, String>> article) {
        this.context = context;
        this.article = article;
        layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        this.pageNumber = 0;   // Initialize the page number with 0
    }

    // Add a method to set the page number in the adapter
    public void setPageNumber(int pageNumber) {
        this.pageNumber = pageNumber;
    }

    @Override
    public int getCount() {
        // You need to modify the getCount function to handle the newly introduced pageNumber
        int articleSize = article.size();

        if(10 * pageNumber > articleSize) return articleSize;
        else return 10 * pageNumber;
    }

    // ... Other functions are not needed to be changed
}

现在您需要在您的ActivityFragment 中获取一个全局pageNumber,并首先将其初始化为零。然后,在初始化 RecyclerView 并将适配器添加到其中之后,您需要在 onCreateonCreateView 函数中的 RecyclerView 中添加滚动侦听器。

public int pageNumber = 0;
private boolean loading = true;
int pastVisiblesItems, visibleItemCount, totalItemCount;

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        if(dy > 0) {
             // Check for scroll down
            visibleItemCount = mLayoutManager.getChildCount();
            totalItemCount = mLayoutManager.getItemCount();
            pastVisiblesItems = mLayoutManager.findFirstVisibleItemPosition();

            if (loading) {
                if ( (visibleItemCount + pastVisiblesItems) >= totalItemCount) {
                    loading = false;
                    Log.v("...", "Last image reached");
                    // Set the pageNumber here. 
                    adapter.setPageNumber(pageNumber + 1);
                    pageNumber += 1; 
                    adapter.notifyDataSetChanged();
                }
            }
        }
    }
});

当您使用RecyclerView 时,您可能会遇到与ViewPager 相同的行为。您只需修改RecyclerView 的每个项目的布局,并将RecyclerView 的布局管理器设置为GridLayoutManager

希望对您有所帮助。

【讨论】:

  • 对不起。实际上我错过了放置java类。我在这里使用的 java 类是 MyCustomPagerAdapter.java。能否请您检查并纠正代码
  • 我在同一个应用程序中还有一个问题stackoverflow.com/questions/48958735/…如果您找到任何解决方案请回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-13
  • 1970-01-01
相关资源
最近更新 更多