Я работаю над проектом - приложение со списком контента
о моем приложении, контент загружается через веб-приложение .NET с использованием базы данных сервера MS Sql. Мне нужно отображать контент в мобильном приложении. Я использую Android Studio версии 3.5. .1
Все работает нормально, но изображения не отображаются. Вместо изображений он показывает счетчик.
build.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 29
buildToolsVersion "29.0.1"
defaultConfig {
applicationId "com.test.www.appname"
minSdkVersion 16
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
dexOptions {
//incremental true
javaMaxHeapSize "4g"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
productFlavors {
}
}
dependencies {
androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'androidx.recyclerview:recyclerview:1.0.0'
implementation 'com.squareup.picasso:picasso:2.5.2'
testImplementation 'junit:junit:4.12'
implementation files('libs/jtds-1.2.7.jar')
implementation files('libs/ftp4j-1.6.jar')
implementation 'com.github.chrisbanes:PhotoView:2.0.0'
}
XML-файл компоновки галереи
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="1dp">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/relContainer">
<Spinner
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="2dp"
android:textSize="18dp"
android:layout_marginTop="20dp"
android:background="@drawable/spinner_selector"
android:id="@+id/spncategory"/>
<LinearLayout
android:id="@+id/wrapper"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/spncategory"
android:layout_centerHorizontal="true"
android:orientation="vertical">
<!-- Recycler View -->
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_marginTop="15dp"
android:layout_width="match_parent"
android:layout_height="328dp"
android:clipToPadding="false"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="0dp" />
</LinearLayout>
</RelativeLayout>
</ScrollView>
Gallery.java
package com.test.www.appname;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.fragment.app.Fragment;
public class Gallery extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.gallerylayout, container, false);
return rootView;
}
}
RecycleView_ActivityFragment.java
package com.test.www.appname;
import android.animation.Animator;
import android.app.ProgressDialog;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Base64;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Set;
import java.util.TimeZone;
import static android.content.Context.MODE_PRIVATE;
public class RecyclerView_ActivityFragment extends Fragment {
private static RecyclerView recyclerView;
ProgressDialog pbd;
ArrayList<String> galleryadpter;
Set<String> set;
private static final String MyPref ="" ;
ConnectionClass connectionClass;
String Item="";
int ItemId;
TextView txtitemid;
String img;
String title;
EditText edtgacustname,edtgamobileno,edtgaemail;
int imgid;
String datein="";
String timein="";
private Spinner spncategory;
private Animator mCurrentAnimator;
private int mShortAnimationDuration;
private Button btnlike,btngasubmit;
int RegIdNo;
private final String TAG="GAlleryFragment";
SharedPreferences prefse;
private static String navigateFrom;//String to get Intent Value
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.gallerylayout, container, false);
connectionClass=new ConnectionClass();
navigateFrom = getActivity().getIntent().getStringExtra("pass_ga");//Get Intent Value in String
ItemnameBind itemnameBind=new ItemnameBind();
itemnameBind.execute("");
String strtext;
if(navigateFrom==null){
strtext = getArguments().getString("edttext");
navigateFrom=strtext;
}else {
Log.d(TAG,"Not-Success");
}
spncategory=(Spinner)rootView.findViewById(R.id.spncategory);
edtgacustname=(EditText)rootView.findViewById(R.id.edtgacustname);
edtgamobileno=(EditText)rootView.findViewById(R.id.edtgamobileno);
edtgaemail=(EditText)rootView.findViewById(R.id.edtgaemail);
txtitemid=(TextView)rootView.findViewById(R.id.txtitemid);
Datetime1();
recyclerView=(RecyclerView)rootView.findViewById(R.id.recycler_view);
btngasubmit=(Button)rootView.findViewById(R.id.btngasubmit);
btnlike=(Button)rootView.findViewById(R.id.btnlike);
if (navigateFrom.equals("pass_gallery")) {
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false));
}
prefse =this.getActivity().getSharedPreferences(MyPref, MODE_PRIVATE);
prefse.edit().remove("yourKey").commit();
btnlike.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try {
set = prefse.getStringSet("yourKey", null);
if((set==null)||set.size()==0) {
Toast.makeText(getActivity(),"Please Select Image",Toast.LENGTH_SHORT).show();
}
else {
galleryadpter = new ArrayList<String>(set);
set.clear();
spncategory.setVisibility(View.GONE);
recyclerView.setVisibility(View.GONE);
btnlike.setVisibility(View.GONE);
edtgacustname.setVisibility(View.VISIBLE);
edtgamobileno.setVisibility(View.VISIBLE);
edtgaemail.setVisibility(View.VISIBLE);
btngasubmit.setVisibility(View.VISIBLE);
}
}
catch (Exception ex){
throw ex;
}
}
});
//button submit action
btngasubmit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Savedata();
}
});
return rootView;
}
public void Datetime1(){
Calendar c = Calendar.getInstance();
SimpleDateFormat dateformat = new SimpleDateFormat("yyyy/MM/dd");
// TODO: Avoid using the abbreviations when fetching time zones.
// Use the full Olson zone ID instead.
dateformat.setTimeZone(TimeZone.getTimeZone("IST"));
datein = dateformat.format(c.getTime());
SimpleDateFormat timeformat = new SimpleDateFormat("hh:mm aa");
timein = timeformat.format(c.getTime());
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case android.R.id.home:
getActivity().finish();
break;
}
return super.onOptionsItemSelected(item);
}
//Itemname Bind the method
public class ItemnameBind extends AsyncTask<String, String, String> {
ArrayList listitemname=new ArrayList();
String Y;
@Override
protected String doInBackground(String... params) {
try{
Connection con=connectionClass.CONN();
if(con==null){
Y="Error in connection with SQL server";
}
else {
String query="Select Category from FD_Category where DataStatus=1";
PreparedStatement preparedStatement=con.prepareStatement(query);
ResultSet rs=preparedStatement.executeQuery();
while (rs.next()){
String itemname1=rs.getString("Category");
listitemname.add(itemname1);
}
Y = "Success";
}
} catch (Exception ex) {
Y = ex.toString();
}
return Y;
}
@Override
protected void onPreExecute() {
}
@Override
protected void onPostExecute(String s) {
/* if(pbd.isShowing())
pbd.dismiss();*/
if(s!="Success"){
Toast.makeText(getActivity(),s,Toast.LENGTH_SHORT).show();
}
ArrayAdapter ownnamedapter=new ArrayAdapter(getActivity(),android.R.layout.simple_spinner_dropdown_item, listitemname);
spncategory.setAdapter(ownnamedapter);
ownnamedapter.notifyDataSetChanged();
spncategory.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
Item=spncategory.getSelectedItem().toString();
ItemIdBind itemidbind=new ItemIdBind();
itemidbind.execute("");
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
}
public class ItemIdBind extends AsyncTask<String,String,String> {
String Y="";
@Override
protected String doInBackground(String... params) {
try{
Connection con=connectionClass.CONN();
if(con==null){
Y="Error with Sql Connection";
}
else {
String query="Select * from FD_Category where Category='"+Item+"'";
PreparedStatement preparedStatement=con.prepareStatement(query);
ResultSet rs=preparedStatement.executeQuery();
while (rs.next()){
ItemId=rs.getInt("Id");
}
Y = "Success";
}
}
catch (Exception ex){
Y=ex.toString();
}
return Y;
}
@Override
protected void onPreExecute() {
}
@Override
protected void onPostExecute(String s) {
if(s!="Success") {
Toast.makeText(getActivity(), s, Toast.LENGTH_SHORT).show();
}
txtitemid.setText(String.valueOf(ItemId));
Fetch fetch=new Fetch();
fetch.execute("");
super.onPostExecute(s);
}
}
//save method
private void Savedata(){
String custnamega=edtgacustname.getText().toString();
String Mobilenoga=edtgamobileno.getText().toString();
String emailidga=edtgaemail.getText().toString();
/*Set<String> set = prefse.getStringSet("yourKey", null);
ArrayList<String> addapterarraylist1 = new ArrayList<String>(set);
for (String temp1 : addapterarraylist1) {
System.out.println(temp1);
Toast.makeText(getActivity(), temp1, Toast.LENGTH_SHORT).show();
}*/
if(custnamega.length()==0){
edtgacustname.requestFocus();
edtgacustname.setError("Enter the Name");
}
else if(Mobilenoga.length()==0||Mobilenoga.length()<10){
edtgamobileno.requestFocus();
edtgamobileno.setError("Enter 10 digit mobile number");
}
else if(emailidga.length()==0){
edtgaemail.requestFocus();
edtgaemail.setError("Enter the Email Id");
}
else {
InsertGallerydata insertgallerydata=new InsertGallerydata();
insertgallerydata.execute("");
}
}
public class Fetch extends AsyncTask<String, String, String> {
String z = "";
String ownid;
ArrayList<Data_Model> arrayList=new ArrayList<>();
@Override
protected void onPreExecute() {
pbd=new ProgressDialog(getActivity());
pbd.setMessage("Please Wait...");
pbd.setCancelable(false);
pbd.show();
}
@Override
protected void onPostExecute(String r) {
// pbbar.setVisibility(View.GONE);
if (pbd.isShowing())
pbd.dismiss();
if(r!="Success"){
Toast.makeText(getActivity(), r, Toast.LENGTH_SHORT).show();
}
try {
RecyclerView_Adapter adapter = new RecyclerView_Adapter(getActivity(), arrayList);
recyclerView.setAdapter(adapter);// set adapter on recyclerview
adapter.notifyDataSetChanged();// Notify the adapter
}
catch (Exception ex){
z= ex.toString();
Toast.makeText(getActivity(),z,Toast.LENGTH_SHORT).show();
}
}
@Override
protected String doInBackground(String... params) {
try {
Connection con = connectionClass.CONN();
if (con == null) {
z = "Error in connection with SQL server";
} else {//
String query="";
query = "select Id,ItemName,Image from FD_ItemMaster where CatId='"+ItemId+"' and DataStatus=1 order by Id desc";
PreparedStatement ps2 = con.prepareStatement(query);
ResultSet rs2 = ps2.executeQuery();
ArrayList data1 = new ArrayList();
while (rs2.next()) {
imgid=rs2.getInt("Id");
title = rs2.getString("ItemName");
img = rs2.getString("Image");
//Convertong Images string to bitmap
// byte[] decodeString = Base64.decode(img, Base64.DEFAULT);
//Bitmap decodebitmap = BitmapFactory.decodeByteArray(decodeString, 0, decodeString.length);
arrayList.add(new Data_Model(title,img,imgid));
}
z="Success";
}
} catch (Exception ex) {
z = ex.toString();
}
return z;
}
}
public class InsertGallerydata extends AsyncTask<String,String,String> {
String Z="";
// int CustGaId=imgid;
String Itemnumber;
int CatGaId=ItemId;
String custnamega=edtgacustname.getText().toString();
String Mobilenoga=edtgamobileno.getText().toString();
String emailidga=edtgaemail.getText().toString();
@Override
protected String doInBackground(String... strings) {
try{
//Set<String> set=prefse.getStringSet("yourKey", null);
// galleryadpter=new ArrayList<String >();
for(String temp:galleryadpter){
Itemnumber=temp;
Connection con=connectionClass.CONN();
if(con==null){
Z = "Error in connection with SQL server";
}
else {
String query = "";
String Like="L";
query = "Insert into FD_Enquiry(ItemId,CategoryId,CustName,CustMobileNo,CustEmailId,EnqDate,TypeOf)values('" + Itemnumber + "','" + ItemId + "','" + custnamega + "','" + Mobilenoga + "','" + emailidga + "','" + datein + "','"+Like+"')";
PreparedStatement pr = con.prepareStatement(query);
pr.executeUpdate();
// super.onPostExecute(s);
Z = "success";
}
}
}
catch (Exception ex)
{
Z= ex.toString();
}
return Z;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onPostExecute(String s) {
// Toast.makeText(getActivity(),s,Toast.LENGTH_SHORT).show();
if(!s.equals("success")){
Toast.makeText(getActivity(),s,Toast.LENGTH_SHORT).show();
}else {
Fetch fe=new Fetch();
fe.execute("");
Toast.makeText(getActivity(), "Saved Successfully..!", Toast.LENGTH_SHORT).show();
spncategory.setVisibility(View.VISIBLE);
recyclerView.setVisibility(View.VISIBLE);
btnlike.setVisibility(View.VISIBLE);
edtgacustname.setVisibility(View.GONE);
edtgamobileno.setVisibility(View.GONE);
edtgaemail.setVisibility(View.GONE);
btngasubmit.setVisibility(View.GONE);
reset();
}
super.onPostExecute(s);
}
}
void reset(){
edtgacustname.setText("");
edtgaemail.setText("");
edtgamobileno.setText("");
galleryadpter.clear();
set.clear();
}
}
RecyclerView_Adapter
package com.test.www.appname;
import android.animation.Animator;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Matrix;
import android.graphics.PointF;
//import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.recyclerview.widget.RecyclerView;
import com.squareup.picasso.Picasso;
import java.io.File;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
public class RecyclerView_Adapter extends RecyclerView.Adapter<RecyclerViewHolder> {// Recyclerview will extend to
// recyclerview adapter
private ArrayList<Data_Model> arrayList;
ArrayList<String> gallerylist=new ArrayList<String>();
private Context context;
private final String TAG = "Recycleview";
ImageView imageDetail;
String itemId;
int j;
String MyPref;
Matrix matrix = new Matrix();
Matrix savedMatrix = new Matrix();
PointF startPoint = new PointF();
PointF midPoint = new PointF();
float oldDist = 1f;
static final int NONE = 0;
static final int DRAG = 1;
static final int ZOOM = 2;
int mode = NONE;
private SharedPreferences prefse;
private String prefName = "";
private Animator mCurrentAnimator;
// The system "short" animation time duration, in milliseconds. This
// duration is ideal for subtle animations or animations that occur
// very frequently.
private int mShortAnimationDuration;
public RecyclerView_Adapter(Context context, ArrayList<Data_Model> arrayList) {
this.context = context;
this.arrayList = arrayList;
}
@Override
public int getItemCount() {
return (null != arrayList ? arrayList.size() : 0);
}
@Override
public void onBindViewHolder(RecyclerViewHolder holder, int position) {
final Data_Model model = arrayList.get(position);
final RecyclerViewHolder mainHolder = (RecyclerViewHolder) holder;// holder
// Bitmap image = BitmapFactory.decodeResource(context.getResources(),model.getImage());// This will convert drawbale image into
// bitmap
// mainHolder.imageview.setImageBitmap(model.getImage());
// setting title
mainHolder.title.setText(arrayList.get(position).getTitle());
mainHolder.txtimgid.setText(String.valueOf(arrayList.get(position).getTxtimgid()));
Picasso.with(this.context).invalidate(model.getImage());
Picasso.with(context)
.load(model.getImage())
.placeholder(R.drawable.loading_images) //
.error(R.drawable.loading_images) //
.into(mainHolder.imageview);
final File url= new File(model.getImage());
final String path=url.toString();
final String rel = path.replace("http:/","http://");
mainHolder.imageview.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent= new Intent(context, ImageZoomGalleryActivity.class);
intent.putExtra("img_urlgallery",rel);
context.startActivity(intent);
}
});
// mainHolder.imageview.setImageBitmap(arrayList.get(position).getImage());
mainHolder.chekitem.setChecked(false);
itemId=mainHolder.txtimgid.getText().toString();
mainHolder.chekitem.setTag(arrayList.get(position));
// holder.chekitem.setOnCheckedChangeListener(null);
mainHolder.chekitem.setOnClickListener(new View.OnClickListener() {
public static final String MyPref = "";
@Override
public void onClick(View view) {
boolean isChecked = mainHolder.chekitem.isChecked();
String itemId1 = mainHolder.txtimgid.getText().toString();
prefse = view.getContext().getSharedPreferences(MyPref,Context.MODE_PRIVATE);
SharedPreferences.Editor edit = prefse.edit();
Set<String> set = new HashSet<>();
try {
restart:
if (isChecked) {
gallerylist.add(itemId1);
for (j = 0; j < gallerylist.size(); j++) {
set.addAll(gallerylist);
edit.putStringSet("yourKey", set);
edit.commit();
Log.d(TAG, "Check Box is selected");
// Toast.makeText(view.getContext(), "Clicked on Checkbox: " + gallerylist.get(j), Toast.LENGTH_LONG).show();
}
} else {
for (int k = 0; k <= gallerylist.size(); k++) {
if (gallerylist.get(k).equals(itemId1)) {
gallerylist.remove(k);
edit.remove("yourKey");
set.addAll(gallerylist);
edit.putStringSet("yourKey", set);
edit.commit();
Log.d(TAG, "Check Box is NOT selected");
/*Toast.makeText(view.getContext(), "Uncheck on Checkbox: is "
, Toast.LENGTH_LONG).show();*/
break restart;
}
//checkBox clicked and unchecked
}
}
} catch (Exception ex) {
throw ex;
}
}
});
}
@Override
public RecyclerViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
// This method will inflate the custom layout and return as viewholder
LayoutInflater mInflater = LayoutInflater.from(viewGroup.getContext());
ViewGroup mainGroup = (ViewGroup) mInflater.inflate(R.layout.item_row, viewGroup, false);
final ImageView image = (ImageView) mainGroup.findViewById(R.id.image);
final TextView title = (TextView) mainGroup.findViewById(R.id.title);
final CheckBox chekitem = (CheckBox) mainGroup.findViewById(R.id.chekitem);
chekitem.setChecked(false);
/** * set on touch listner on image */
RecyclerViewHolder listHolder = new RecyclerViewHolder(mainGroup);
return listHolder;
}
}
RecyclerView_Holder
package com.test.www.appname;
//import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.recyclerview.widget.RecyclerView;
public class RecyclerViewHolder extends RecyclerView.ViewHolder {
// View holder for gridview recycler view as we used in listview
public TextView title;
public ImageView imageview;
public CheckBox chekitem;
public TextView txtimgid;
public RecyclerViewHolder(View view) {
super(view);
// Find all views ids
this.title = (TextView) view.findViewById(R.id.title);
this.imageview = (ImageView) view.findViewById(R.id.image);
this.chekitem=(CheckBox)view.findViewById(R.id.chekitem);
this.txtimgid=(TextView)view.findViewById(R.id.txtimgid);
}
}
Заранее спасибо